diff --git a/tools/sdbusplus/property.py b/tools/sdbusplus/property.py
index 0297e79..fed9782 100644
--- a/tools/sdbusplus/property.py
+++ b/tools/sdbusplus/property.py
@@ -44,6 +44,19 @@
             return "std::string"
         return self.cppTypeName
 
+    def enum_namespace(self, interface):
+        if not self.is_enum():
+            return ""
+        l = self.cppTypeParam(interface).split("::")[0:-1]
+        if len(l) != 0:
+            return "::".join(l) + "::"
+        return ""
+
+    def enum_name(self, interface):
+        if not self.is_enum():
+            return ""
+        return self.cppTypeParam(interface).split("::")[-1]
+
     def parse_cpp_type(self, typeName):
         if not typeName:
             return None
diff --git a/tools/sdbusplus/templates/interface.mako.server.cpp b/tools/sdbusplus/templates/interface.mako.server.cpp
index efcc7c0..faaed4d 100644
--- a/tools/sdbusplus/templates/interface.mako.server.cpp
+++ b/tools/sdbusplus/templates/interface.mako.server.cpp
@@ -47,10 +47,12 @@
         const char* property, sd_bus_message* reply, void* context,
         sd_bus_error* error)
 {
+    using sdbusplus::server::binding::details::convertForMessage;
+
     auto m = message::message(sd_bus_message_ref(reply));
 
     auto o = static_cast<${classname}*>(context);
-    m.append(o->${p.camelCase}());
+    m.append(convertForMessage(o->${p.camelCase}()));
 
     return true;
 }
@@ -78,7 +80,12 @@
 
     ${p.cppTypeMessage(interface.name)} v{};
     m.read(v);
+    % if p.is_enum():
+    o->${p.camelCase}(${p.enum_namespace(interface.name)}\
+convert${p.enum_name(interface.name)}FromString(v));
+    % else:
     o->${p.camelCase}(v);
+    % endif
 
     return true;
 }
diff --git a/tools/sdbusplus/templates/method.mako.prototype.hpp b/tools/sdbusplus/templates/method.mako.prototype.hpp
index 96e7390..7d295eb 100644
--- a/tools/sdbusplus/templates/method.mako.prototype.hpp
+++ b/tools/sdbusplus/templates/method.mako.prototype.hpp
@@ -13,18 +13,20 @@
         return ",\n            ".\
             join([ parameter(p, defaultValue) for p in method.parameters ])
 
-    def parameters_as_local():
-        return "{};\n    ".join([ parameter(p) 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_list():
-        return ", ".join([ p.camelCase 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)
                 for p in method.parameters ])
 
-    def parameter(p, defaultValue=False):
-        r = "%s %s" % (p.cppTypeParam(interface.name), p.camelCase)
+    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)
         if defaultValue:
             r += default_value(p)
         return r
@@ -33,8 +35,9 @@
         return ", ".join([ (r.cppTypeParam(interface.name) if as_param else
                 r.cppTypeMessage(interface.name)) for r in method.returns ])
 
-    def returns_as_tuple_index(tuple):
-        return ", ".join([ "std::move(std::get<%d>(%s))" % (i,tuple) \
+    def returns_as_tuple_index(tuple, pre="", post=""):
+        return ", ".join([ "%sstd::move(std::get<%d>(%s))%s" %\
+                (pre,i,tuple,post) \
                 for i in range(len(method.returns))])
 
     def default_value(p):
@@ -61,6 +64,15 @@
         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'
@@ -109,6 +121,8 @@
 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
@@ -116,7 +130,7 @@
         auto m = message::message(sd_bus_message_ref(msg));
 
     % if len(method.parameters) != 0:
-        ${parameters_as_local()}{};
+        ${parameters_as_local(as_param=False)}{};
 
         m.read(${parameters_as_list()});
     % endif
@@ -125,15 +139,16 @@
     % if len(method.returns) != 0:
         auto r = \
     %endif
-        o->${ method.camelCase }(${parameters_as_list()});
+        o->${ method.camelCase }(${parameters_as_list(transform=enum_convert)});
 
         auto reply = m.new_method_return();
     % if len(method.returns) == 0:
         // No data to append on reply.
     % elif len(method.returns) == 1:
-        reply.append(std::move(r));
+        reply.append(convertForMessage(std::move(r)));
     % else:
-        reply.append(${returns_as_tuple_index("r")});
+        reply.append(\
+${returns_as_tuple_index("r",pre="convertForMessage(",post=")")});
     % endif
 
         reply.method_return();
diff --git a/tools/sdbusplus/templates/signal.mako.prototype.hpp b/tools/sdbusplus/templates/signal.mako.prototype.hpp
index eb5ffca..e547310 100644
--- a/tools/sdbusplus/templates/signal.mako.prototype.hpp
+++ b/tools/sdbusplus/templates/signal.mako.prototype.hpp
@@ -9,8 +9,9 @@
             r += default_value(p)
         return r
 
-    def parameters_as_list():
-        return ", ".join([ p.camelCase for p in signal.properties ])
+    def parameters_as_list(pre="", post=""):
+        return ", ".join([ "%s%s%s" % (pre, p.camelCase, post)
+                for p in signal.properties ])
 
     def parameters_types_as_list():
         return ", ".join([ p.cppTypeMessage(interface.name)
@@ -55,10 +56,12 @@
 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() });
+    m.append(${ parameters_as_list(pre="convertForMessage(", post=")") });
     m.signal_send();
 }
 
