diff --git a/tools/sdbusplus/interface.py b/tools/sdbusplus/interface.py
index 9f85f03..e28425b 100644
--- a/tools/sdbusplus/interface.py
+++ b/tools/sdbusplus/interface.py
@@ -40,6 +40,9 @@
     def cppNamespacedClass(self):
         return self.cppNamespace() + "::" + self.classname
 
+    def joinedName(self, join_str, append):
+        return join_str.join(self.namespaces + [self.classname, append])
+
     def enum_includes(self, inc_list):
         includes = []
         namespaces = []
diff --git a/tools/sdbusplus/templates/interface.client.hpp.mako b/tools/sdbusplus/templates/interface.client.hpp.mako
index c615ced..78f7125 100644
--- a/tools/sdbusplus/templates/interface.client.hpp.mako
+++ b/tools/sdbusplus/templates/interface.client.hpp.mako
@@ -1,25 +1,21 @@
 #pragma once
 
-<%
-    namespaces = interface.name.split('.')
-    classname = namespaces.pop()
-%>
 namespace sdbusplus
 {
-% for s in namespaces:
+% for s in interface.namespaces:
 namespace ${s}
 {
 % endfor
 namespace client
 {
-namespace ${classname}
+namespace ${interface.classname}
 {
 
 static constexpr auto interface = "${interface.name}";
 
-} // namespace ${classname}
+} // namespace ${interface.classname}
 } // namespace client
-% for s in reversed(namespaces):
+% for s in reversed(interface.namespaces):
 } // namespace ${s}
 % endfor
 } // namespace sdbusplus
diff --git a/tools/sdbusplus/templates/interface.server.cpp.mako b/tools/sdbusplus/templates/interface.server.cpp.mako
index fa1c12d..f544ed7 100644
--- a/tools/sdbusplus/templates/interface.server.cpp.mako
+++ b/tools/sdbusplus/templates/interface.server.cpp.mako
@@ -7,14 +7,10 @@
 #include <string>
 #include <tuple>
 
-#include <${"/".join(interface.name.split('.') + [ 'server.hpp' ])}>
+#include <${interface.joinedName("/", "server.hpp")}>
 % for m in interface.methods + interface.properties + interface.signals:
 ${ m.cpp_prototype(loader, interface=interface, ptype='callback-cpp-includes') }
 % endfor
-<%
-    namespaces = interface.name.split('.')
-    classname = namespaces.pop()
-%>
 namespace sdbusplus::${interface.cppNamespace()}
 {
 
@@ -31,7 +27,7 @@
     % endfor
 
     % if interface.properties:
-void ${classname}::setPropertyByName(const std::string& _name,
+void ${interface.classname}::setPropertyByName(const std::string& _name,
                                      const PropertiesVariant& val,
                                      bool skipSignal)
 {
@@ -46,7 +42,7 @@
         % endfor
 }
 
-auto ${classname}::getPropertyByName(const std::string& _name) ->
+auto ${interface.classname}::getPropertyByName(const std::string& _name) ->
         PropertiesVariant
 {
     % for p in interface.properties:
@@ -64,26 +60,26 @@
 
 namespace
 {
-/** String to enum mapping for ${classname}::${e.name} */
-static const std::tuple<const char*, ${classname}::${e.name}> \
-mapping${classname}${e.name}[] =
+/** String to enum mapping for ${interface.classname}::${e.name} */
+static const std::tuple<const char*, ${interface.classname}::${e.name}> \
+mapping${interface.classname}${e.name}[] =
         {
         % for v in e.values:
             std::make_tuple( "${interface.name}.${e.name}.${v.name}", \
-                ${classname}::${e.name}::${v.name} ),
+                ${interface.classname}::${e.name}::${v.name} ),
         % endfor
         };
 
 } // anonymous namespace
 
-auto ${classname}::convertStringTo${e.name}(const std::string& s) noexcept ->
+auto ${interface.classname}::convertStringTo${e.name}(const std::string& s) noexcept ->
         std::optional<${e.name}>
 {
     auto i = std::find_if(
-            std::begin(mapping${classname}${e.name}),
-            std::end(mapping${classname}${e.name}),
+            std::begin(mapping${interface.classname}${e.name}),
+            std::end(mapping${interface.classname}${e.name}),
             [&s](auto& e){ return 0 == strcmp(s.c_str(), std::get<0>(e)); } );
-    if (std::end(mapping${classname}${e.name}) == i)
+    if (std::end(mapping${interface.classname}${e.name}) == i)
     {
         return std::nullopt;
     }
@@ -93,7 +89,7 @@
     }
 }
 
-auto ${classname}::convert${e.name}FromString(const std::string& s) ->
+auto ${interface.classname}::convert${e.name}FromString(const std::string& s) ->
         ${e.name}
 {
     auto r = convertStringTo${e.name}(s);
@@ -108,13 +104,13 @@
     }
 }
 
-std::string ${classname}::convert${e.name}ToString(${classname}::${e.name} v)
+std::string ${interface.classname}::convert${e.name}ToString(${interface.classname}::${e.name} v)
 {
     auto i = std::find_if(
-            std::begin(mapping${classname}${e.name}),
-            std::end(mapping${classname}${e.name}),
+            std::begin(mapping${interface.classname}${e.name}),
+            std::end(mapping${interface.classname}${e.name}),
             [v](auto& e){ return v == std::get<1>(e); });
-    if (i == std::end(mapping${classname}${e.name}))
+    if (i == std::end(mapping${interface.classname}${e.name}))
     {
         throw std::invalid_argument(std::to_string(static_cast<int>(v)));
     }
@@ -122,7 +118,7 @@
 }
     % endfor
 
-const vtable_t ${classname}::_vtable[] = {
+const vtable_t ${interface.classname}::_vtable[] = {
     vtable::start(),
     % for m in interface.methods:
 ${ m.cpp_prototype(loader, interface=interface, ptype='vtable') }
@@ -132,7 +128,7 @@
     % endfor
     % for p in interface.properties:
     vtable::property("${p.name}",
-                     details::${classname}::_property_${p.name}
+                     details::${interface.classname}::_property_${p.name}
                         .data(),
                      _callback_get_${p.name},
         % if 'const' not in p.flags and 'readonly' not in p.flags:
diff --git a/tools/sdbusplus/templates/interface.server.hpp.mako b/tools/sdbusplus/templates/interface.server.hpp.mako
index a1e38d5..bedf382 100644
--- a/tools/sdbusplus/templates/interface.server.hpp.mako
+++ b/tools/sdbusplus/templates/interface.server.hpp.mako
@@ -12,21 +12,15 @@
 ${ m.cpp_prototype(loader, interface=interface, ptype='callback-hpp-includes') }\
 % endfor
 <%
-    namespaces = interface.namespaces
-    classname = interface.classname
-
     def setOfPropertyTypes():
         return set(p.cppTypeParam(interface.name) for p in
                    interface.properties);
-
-    def interface_instance():
-        return "_".join(interface.name.split('.') + ['interface'])
 %>
 
 namespace sdbusplus::${interface.cppNamespace()}
 {
 
-class ${classname}
+class ${interface.classname}
 {
     public:
         static constexpr auto interface =
@@ -41,19 +35,19 @@
          *     Allowed:
          *         - Destructor.
          */
-        ${classname}() = delete;
-        ${classname}(const ${classname}&) = delete;
-        ${classname}& operator=(const ${classname}&) = delete;
-        ${classname}(${classname}&&) = delete;
-        ${classname}& operator=(${classname}&&) = delete;
-        virtual ~${classname}() = default;
+        ${interface.classname}() = delete;
+        ${interface.classname}(const ${interface.classname}&) = delete;
+        ${interface.classname}& operator=(const ${interface.classname}&) = delete;
+        ${interface.classname}(${interface.classname}&&) = delete;
+        ${interface.classname}& operator=(${interface.classname}&&) = delete;
+        virtual ~${interface.classname}() = default;
 
         /** @brief Constructor to put object onto bus at a dbus path.
          *  @param[in] bus - Bus to attach to.
          *  @param[in] path - Path to attach at.
          */
-        ${classname}(bus_t& bus, const char* path) :
-            _${interface_instance()}(
+        ${interface.classname}(bus_t& bus, const char* path) :
+            _${interface.joinedName("_", "interface")}(
                 bus, path, interface, _vtable, this),
             _intf(bus.getInterface()) {}
 
@@ -76,10 +70,10 @@
          *  @param[in] path - Path to attach at.
          *  @param[in] vals - Map of property name to value for initialization.
          */
-        ${classname}(bus_t& bus, const char* path,
+        ${interface.classname}(bus_t& bus, const char* path,
                      const std::map<std::string, PropertiesVariant>& vals,
                      bool skipSignal = false) :
-            ${classname}(bus, path)
+            ${interface.classname}(bus, path)
         {
             for (const auto& v : vals)
             {
@@ -153,13 +147,13 @@
         /** @brief Emit interface added */
         void emit_added()
         {
-            _${"_".join(interface.name.split('.'))}_interface.emit_added();
+            _${interface.joinedName("_", "interface")}.emit_added();
         }
 
         /** @brief Emit interface removed */
         void emit_removed()
         {
-            _${"_".join(interface.name.split('.'))}_interface.emit_removed();
+            _${interface.joinedName("_", "interface")}.emit_removed();
         }
 
     private:
@@ -182,7 +176,7 @@
     % endfor
         static const vtable_t _vtable[];
         sdbusplus::server::interface_t
-                _${"_".join(interface.name.split('.'))}_interface;
+                _${interface.joinedName("_", "interface")};
         sdbusplus::SdBusInterface* _intf;
     % for p in interface.properties:
         % if p.defaultValue is not None:
@@ -201,16 +195,16 @@
 
     % for e in interface.enums:
 /* Specialization of sdbusplus::server::convertForMessage
- * for enum-type ${classname}::${e.name}.
+ * for enum-type ${interface.classname}::${e.name}.
  *
  * This converts from the enum to a constant c-string representing the enum.
  *
  * @param[in] e - Enum value to convert.
  * @return C-string representing the name for the enum value.
  */
-inline std::string convertForMessage(${classname}::${e.name} e)
+inline std::string convertForMessage(${interface.classname}::${e.name} e)
 {
-    return ${classname}::convert${e.name}ToString(e);
+    return ${interface.classname}::convert${e.name}ToString(e);
 }
     % endfor
 
diff --git a/tools/sdbusplus/templates/method.prototype.hpp.mako b/tools/sdbusplus/templates/method.prototype.hpp.mako
index f86458a..16f0312 100644
--- a/tools/sdbusplus/templates/method.prototype.hpp.mako
+++ b/tools/sdbusplus/templates/method.prototype.hpp.mako
@@ -1,7 +1,4 @@
 <%
-    def interface_name():
-        return interface.name.split('.').pop()
-
     def error_namespace(e):
         n = e.split('.');
         n.pop(); # Remove error name.
@@ -52,9 +49,9 @@
 ###
     % elif ptype == 'vtable':
     vtable::method("${method.name}",
-                   details::${interface_name()}::_param_${ method.CamelCase }
+                   details::${interface.classname}::_param_${ method.CamelCase }
                         .data(),
-                   details::${interface_name()}::_return_${ method.CamelCase }
+                   details::${interface.classname}::_return_${ method.CamelCase }
                         .data(),
         % if method.cpp_flags:
                    _callback_${method.CamelCase},
@@ -66,10 +63,10 @@
 ### Emit 'callback-cpp'
 ###
     % elif ptype == 'callback-cpp':
-int ${interface_name()}::_callback_${ method.CamelCase }(
+int ${interface.classname}::_callback_${ method.CamelCase }(
         sd_bus_message* msg, void* context, sd_bus_error* error)
 {
-    auto o = static_cast<${interface_name()}*>(context);
+    auto o = static_cast<${interface.classname}*>(context);
 
     % if method.errors:
     try
@@ -99,7 +96,7 @@
 
 namespace details
 {
-namespace ${interface_name()}
+namespace ${interface.classname}
 {
 static const auto _param_${ method.CamelCase } =
     % if len(method.parameters) == 0:
diff --git a/tools/sdbusplus/templates/property.prototype.hpp.mako b/tools/sdbusplus/templates/property.prototype.hpp.mako
index 39f12f8..48692db 100644
--- a/tools/sdbusplus/templates/property.prototype.hpp.mako
+++ b/tools/sdbusplus/templates/property.prototype.hpp.mako
@@ -1,10 +1,4 @@
 <%
-    namespaces = interface.name.split('.')
-    classname = namespaces.pop()
-
-    def interface_instance():
-        return "_".join(interface.name.split('.') + ['interface'])
-
     def error_namespace(e):
         n = e.split('.');
         n.pop(); # Remove error name.
@@ -21,18 +15,18 @@
         return '/'.join(l) + '/error.hpp';
 %>
 % if ptype == 'callback-cpp':
-auto ${classname}::${property.camelCase}() const ->
+auto ${interface.classname}::${property.camelCase}() const ->
         ${property.cppTypeParam(interface.name)}
 {
     return _${property.camelCase};
 }
 
-int ${classname}::_callback_get_${property.name}(
+int ${interface.classname}::_callback_get_${property.name}(
         sd_bus* /*bus*/, const char* /*path*/, const char* /*interface*/,
         const char* /*property*/, sd_bus_message* reply, void* context,
         sd_bus_error* error)
 {
-    auto o = static_cast<${classname}*>(context);
+    auto o = static_cast<${interface.classname}*>(context);
 
     % if property.errors:
     try
@@ -55,7 +49,7 @@
     % endfor
 }
 
-auto ${classname}::${property.camelCase}(${property.cppTypeParam(interface.name)} value,
+auto ${interface.classname}::${property.camelCase}(${property.cppTypeParam(interface.name)} value,
                                          bool skipSignal) ->
         ${property.cppTypeParam(interface.name)}
 {
@@ -64,26 +58,26 @@
         _${property.camelCase} = value;
         if (!skipSignal)
         {
-            _${interface_instance()}.property_changed("${property.name}");
+            _${interface.joinedName("_", "interface")}.property_changed("${property.name}");
         }
     }
 
     return _${property.camelCase};
 }
 
-auto ${classname}::${property.camelCase}(${property.cppTypeParam(interface.name)} val) ->
+auto ${interface.classname}::${property.camelCase}(${property.cppTypeParam(interface.name)} val) ->
         ${property.cppTypeParam(interface.name)}
 {
     return ${property.camelCase}(val, false);
 }
 
 % if 'const' not in property.flags and 'readonly' not in property.flags:
-int ${classname}::_callback_set_${property.name}(
+int ${interface.classname}::_callback_set_${property.name}(
         sd_bus* /*bus*/, const char* /*path*/, const char* /*interface*/,
         const char* /*property*/, sd_bus_message* value, void* context,
         sd_bus_error* error)
 {
-    auto o = static_cast<${classname}*>(context);
+    auto o = static_cast<${interface.classname}*>(context);
 
     % if property.errors:
     try
@@ -109,7 +103,7 @@
 
 namespace details
 {
-namespace ${classname}
+namespace ${interface.classname}
 {
 static const auto _property_${property.name} =
     utility::tuple_to_array(message::types::type_id<
diff --git a/tools/sdbusplus/templates/signal.prototype.hpp.mako b/tools/sdbusplus/templates/signal.prototype.hpp.mako
index 113785e..33bcf27 100644
--- a/tools/sdbusplus/templates/signal.prototype.hpp.mako
+++ b/tools/sdbusplus/templates/signal.prototype.hpp.mako
@@ -22,9 +22,6 @@
             return " = " + str(p.defaultValue)
         else:
             return ""
-
-    def interface_name():
-        return interface.name.split('.').pop()
 %>
 ###
 ### Emit 'header'
@@ -47,13 +44,13 @@
 ###
     % elif ptype == 'vtable':
     vtable::signal("${signal.name}",
-                   details::${interface_name()}::_signal_${signal.CamelCase }
+                   details::${interface.classname}::_signal_${signal.CamelCase }
                         .data()),
 ###
 ### Emit 'callback-cpp'
 ###
     % elif ptype == 'callback-cpp':
-void ${interface_name()}::${ signal.camelCase }(
+void ${interface.classname}::${ signal.camelCase }(
             ${ parameters() })
 {
     auto& i = _${"_".join(interface.name.split('.'))}_interface;
@@ -65,7 +62,7 @@
 
 namespace details
 {
-namespace ${interface_name()}
+namespace ${interface.classname}
 {
 static const auto _signal_${ signal.CamelCase } =
     % if len(signal.properties) == 0:
