diff --git a/tools/sdbusplus/property.py b/tools/sdbusplus/property.py
index 4349186..34a71c1 100644
--- a/tools/sdbusplus/property.py
+++ b/tools/sdbusplus/property.py
@@ -30,10 +30,12 @@
     """ Return a conversion of the cppTypeName valid as a function parameter.
         Currently only 'enum' requires conversion.
     """
-    def cppTypeParam(self, interface, server=True):
+    def cppTypeParam(self, interface, full=False, server=True):
         r = self.cppTypeName
 
         if self.is_enum():
+            if "." not in r and full:
+                r = interface + "." + r
             if "." in r:
                 r = r.split('.')
                 r.insert(-2, "server" if server else "client")
@@ -41,14 +43,6 @@
 
         return r
 
-    """ Return a conversion of the cppTypeName valid as it is read out of a
-        message.  Currently only 'enum' requires conversion.
-    """
-    def cppTypeMessage(self, interface):
-        if self.is_enum():
-            return "std::string"
-        return self.cppTypeName
-
     def enum_namespace(self, interface):
         if not self.is_enum():
             return ""
diff --git a/tools/sdbusplus/templates/method.mako.prototype.hpp.in b/tools/sdbusplus/templates/method.mako.prototype.hpp.in
index fa88e30..c9065d3 100644
--- a/tools/sdbusplus/templates/method.mako.prototype.hpp.in
+++ b/tools/sdbusplus/templates/method.mako.prototype.hpp.in
@@ -13,27 +13,25 @@
         return ",\n            ".\
             join([ parameter(p, defaultValue) for p in method.parameters ])
 
-    def parameters_as_local(as_param=True):
-        return "{};\n    ".join([ parameter(p,as_param=as_param)
-                for p in method.parameters ])
+    def parameters_as_local():
+        return "{};\n    ".join([ parameter(p) for p in method.parameters ])
 
     def parameters_as_list(transform=lambda p: p.camelCase):
         return ", ".join([ transform(p) for p in method.parameters ])
 
     def parameters_types_as_list():
-        return ", ".join([ p.cppTypeMessage(interface.name)
+        return ", ".join([ p.cppTypeParam(interface.name, full=True)
                 for p in method.parameters ])
 
-    def parameter(p, defaultValue=False, as_param=True):
-        r = "%s %s" % (p.cppTypeParam(interface.name) if as_param else \
-                p.cppTypeMessage(interface.name), p.camelCase)
+    def parameter(p, defaultValue=False):
+        r = "%s %s" % (p.cppTypeParam(interface.name), p.camelCase)
         if defaultValue:
             r += default_value(p)
         return r
 
-    def returns_as_list(as_param=True):
-        return ", ".join([ (r.cppTypeParam(interface.name) if as_param else
-                r.cppTypeMessage(interface.name)) for r in method.returns ])
+    def returns_as_list(full=False):
+        return ", ".join([ r.cppTypeParam(interface.name, full=full)
+                for r in method.returns ])
 
     def returns_as_tuple_index(tuple, pre="", post=""):
         return ", ".join([ "%sstd::move(std::get<%d>(%s))%s" %\
@@ -63,16 +61,6 @@
         l = error_namespace(e).split('::')
         l.pop() # Remove "Error"
         return '/'.join(l) + '/error.hpp';
-
-    def enum_convert(p):
-        if not p.is_enum():
-            return p.camelCase
-        else:
-            return "%sconvert%sFromString(%s)" % \
-                (p.enum_namespace(interface.name),
-                 p.enum_name(interface.name),
-                 p.camelCase)
-
 %>
 ###
 ### Emit 'header'
@@ -121,8 +109,6 @@
 int ${interface_name()}::_callback_${ method.CamelCase }(
         sd_bus_message* msg, void* context, sd_bus_error* error)
 {
-    using sdbusplus::server::binding::details::convertForMessage;
-
     try
     {
         ### Need to add a ref to msg since we attached it to an
@@ -138,7 +124,7 @@
 #endif
 
     % if len(method.parameters) != 0:
-        ${parameters_as_local(as_param=False)}{};
+        ${parameters_as_local()}{};
 
         m.read(${parameters_as_list()});
     % endif
@@ -147,16 +133,16 @@
     % if len(method.returns) != 0:
         auto r = \
     %endif
-        o->${ method.camelCase }(${parameters_as_list(transform=enum_convert)});
+        o->${ method.camelCase }(${parameters_as_list()});
 
         auto reply = m.new_method_return();
     % if len(method.returns) == 0:
         // No data to append on reply.
     % elif len(method.returns) == 1:
-        reply.append(convertForMessage(std::move(r)));
+        reply.append(std::move(r));
     % else:
         reply.append(\
-${returns_as_tuple_index("r",pre="convertForMessage(",post=")")});
+${returns_as_tuple_index("r")});
     % endif
 
         reply.method_return();
@@ -191,7 +177,7 @@
         utility::tuple_to_array(std::make_tuple('\0'));
     % else:
         utility::tuple_to_array(message::types::type_id<
-                ${ returns_as_list(as_param=False) }>());
+                ${ returns_as_list(full=True) }>());
     % endif
 }
 }
diff --git a/tools/sdbusplus/templates/property.mako.prototype.hpp.in b/tools/sdbusplus/templates/property.mako.prototype.hpp.in
index 4d9a56e..238d6af 100644
--- a/tools/sdbusplus/templates/property.mako.prototype.hpp.in
+++ b/tools/sdbusplus/templates/property.mako.prototype.hpp.in
@@ -32,8 +32,6 @@
         const char* property, sd_bus_message* reply, void* context,
         sd_bus_error* error)
 {
-    using sdbusplus::server::binding::details::convertForMessage;
-
     // TODO(venture): Can this except? I wouldn't think so.
     auto o = static_cast<${classname}*>(context);
 
@@ -50,7 +48,7 @@
         }
 #endif
 
-        m.append(convertForMessage(o->${property.camelCase}()));
+        m.append(o->${property.camelCase}());
     }
     catch(sdbusplus::internal_exception_t& e)
     {
@@ -107,14 +105,9 @@
         }
 #endif
 
-        ${property.cppTypeMessage(interface.name)} v{};
+        ${property.cppTypeParam(interface.name)} v{};
         m.read(v);
-    % if property.is_enum():
-        o->${property.camelCase}(${property.enum_namespace(interface.name)}\
-convert${property.enum_name(interface.name)}FromString(v));
-    % else:
         o->${property.camelCase}(v);
-    % endif
     }
     catch(sdbusplus::internal_exception_t& e)
     {
@@ -136,7 +129,7 @@
 {
 static const auto _property_${property.name} =
     utility::tuple_to_array(message::types::type_id<
-            ${property.cppTypeMessage(interface.name)}>());
+            ${property.cppTypeParam(interface.name, full=True)}>());
 }
 }
 % elif ptype == 'callback-cpp-includes':
diff --git a/tools/sdbusplus/templates/signal.mako.prototype.hpp b/tools/sdbusplus/templates/signal.mako.prototype.hpp
index 048eedb..113785e 100644
--- a/tools/sdbusplus/templates/signal.mako.prototype.hpp
+++ b/tools/sdbusplus/templates/signal.mako.prototype.hpp
@@ -14,7 +14,7 @@
                 for p in signal.properties ])
 
     def parameters_types_as_list():
-        return ", ".join([ p.cppTypeMessage(interface.name)
+        return ", ".join([ p.cppTypeParam(interface.name, full=True)
                 for p in signal.properties ])
 
     def default_value(p):
@@ -56,12 +56,10 @@
 void ${interface_name()}::${ signal.camelCase }(
             ${ parameters() })
 {
-    using sdbusplus::server::binding::details::convertForMessage;
-
     auto& i = _${"_".join(interface.name.split('.'))}_interface;
     auto m = i.new_signal("${ signal.name }");
 
-    m.append(${ parameters_as_list(pre="convertForMessage(", post=")") });
+    m.append(${ parameters_as_list() });
     m.signal_send();
 }
 
