diff --git a/configure.ac b/configure.ac
index aedae42..9ca9f77 100644
--- a/configure.ac
+++ b/configure.ac
@@ -92,4 +92,5 @@
 AC_CONFIG_FILES([sdbusplus/server.hpp])
 AC_CONFIG_FILES([tools/sdbusplus/templates/interface.mako.server.cpp])
 AC_CONFIG_FILES([tools/sdbusplus/templates/method.mako.prototype.hpp])
+AC_CONFIG_FILES([tools/sdbusplus/templates/property.mako.prototype.hpp])
 AC_OUTPUT
diff --git a/tools/sdbusplus/property.py b/tools/sdbusplus/property.py
index 7ed53ed..c6444c8 100644
--- a/tools/sdbusplus/property.py
+++ b/tools/sdbusplus/property.py
@@ -164,3 +164,7 @@
     def markdown(self, loader):
         return self.render(loader, "property.mako.md", property=self,
                            post=str.strip)
+
+    def cpp_prototype(self, loader, interface, ptype):
+        return self.render(loader, "property.mako.prototype.hpp", property=self,
+                           interface=interface, ptype=ptype, post=str.rstrip)
diff --git a/tools/sdbusplus/templates/interface.mako.server.cpp.in b/tools/sdbusplus/templates/interface.mako.server.cpp.in
index d519c26..4b46711 100644
--- a/tools/sdbusplus/templates/interface.mako.server.cpp.in
+++ b/tools/sdbusplus/templates/interface.mako.server.cpp.in
@@ -49,105 +49,7 @@
     % endfor
 
     % for p in interface.properties:
-auto ${classname}::${p.camelCase}() const ->
-        ${p.cppTypeParam(interface.name)}
-{
-    return _${p.camelCase};
-}
-
-int ${classname}::_callback_get_${p.name}(
-        sd_bus* bus, const char* path, const char* interface,
-        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);
-
-    try
-    {
-        auto m = message::message(reply, o->_intf);
-
-#if @WANT_TRANSACTION@
-        {
-            auto tbus = m.get_bus();
-            sdbusplus::server::transaction::Transaction t(tbus, m);
-            sdbusplus::server::transaction::set_id
-                (std::hash<sdbusplus::server::transaction::Transaction>{}(t));
-        }
-#endif
-
-        m.append(convertForMessage(o->${p.camelCase}()));
-    }
-    catch(sdbusplus::internal_exception_t& e)
-    {
-        o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
-        return -EINVAL;
-    }
-
-    return true;
-}
-
-auto ${classname}::${p.camelCase}(${p.cppTypeParam(interface.name)} value) ->
-        ${p.cppTypeParam(interface.name)}
-{
-    if (_${p.camelCase} != value)
-    {
-        _${p.camelCase} = value;
-        _${interface_instance()}.property_changed("${p.name}");
-    }
-
-    return _${p.camelCase};
-}
-
-int ${classname}::_callback_set_${p.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);
-
-    try
-    {
-        auto m = message::message(value, o->_intf);
-
-#if @WANT_TRANSACTION@
-        {
-            auto tbus = m.get_bus();
-            sdbusplus::server::transaction::Transaction t(tbus, m);
-            sdbusplus::server::transaction::set_id
-                (std::hash<sdbusplus::server::transaction::Transaction>{}(t));
-        }
-#endif
-
-        ${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
-    }
-    catch(sdbusplus::internal_exception_t& e)
-    {
-        o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
-        return -EINVAL;
-    }
-
-    return true;
-}
-
-namespace details
-{
-namespace ${classname}
-{
-static const auto _property_${p.name} =
-    utility::tuple_to_array(message::types::type_id<
-            ${p.cppTypeMessage(interface.name)}>());
-}
-}
+${ p.cpp_prototype(loader, interface=interface, ptype='callback-cpp') }
     % endfor
 
     % if interface.properties:
diff --git a/tools/sdbusplus/templates/property.mako.prototype.hpp.in b/tools/sdbusplus/templates/property.mako.prototype.hpp.in
new file mode 100644
index 0000000..fd4a28e
--- /dev/null
+++ b/tools/sdbusplus/templates/property.mako.prototype.hpp.in
@@ -0,0 +1,106 @@
+<%
+    namespaces = interface.name.split('.')
+    classname = namespaces.pop()
+
+    def interface_instance():
+        return "_".join(interface.name.split('.') + ['interface'])
+%>
+auto ${classname}::${property.camelCase}() const ->
+        ${property.cppTypeParam(interface.name)}
+{
+    return _${property.camelCase};
+}
+
+int ${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)
+{
+    using sdbusplus::server::binding::details::convertForMessage;
+
+    // TODO(venture): Can this except? I wouldn't think so.
+    auto o = static_cast<${classname}*>(context);
+
+    try
+    {
+        auto m = message::message(reply, o->_intf);
+
+#if @WANT_TRANSACTION@
+        {
+            auto tbus = m.get_bus();
+            sdbusplus::server::transaction::Transaction t(tbus, m);
+            sdbusplus::server::transaction::set_id
+                (std::hash<sdbusplus::server::transaction::Transaction>{}(t));
+        }
+#endif
+
+        m.append(convertForMessage(o->${property.camelCase}()));
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+auto ${classname}::${property.camelCase}(${property.cppTypeParam(interface.name)} value) ->
+        ${property.cppTypeParam(interface.name)}
+{
+    if (_${property.camelCase} != value)
+    {
+        _${property.camelCase} = value;
+        _${interface_instance()}.property_changed("${property.name}");
+    }
+
+    return _${property.camelCase};
+}
+
+int ${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);
+
+    try
+    {
+        auto m = message::message(value, o->_intf);
+
+#if @WANT_TRANSACTION@
+        {
+            auto tbus = m.get_bus();
+            sdbusplus::server::transaction::Transaction t(tbus, m);
+            sdbusplus::server::transaction::set_id
+                (std::hash<sdbusplus::server::transaction::Transaction>{}(t));
+        }
+#endif
+
+        ${property.cppTypeMessage(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)
+    {
+        o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace ${classname}
+{
+static const auto _property_${property.name} =
+    utility::tuple_to_array(message::types::type_id<
+            ${property.cppTypeMessage(interface.name)}>());
+}
+}
