diff --git a/example/get-all-properties.cpp b/example/get-all-properties.cpp
index fec7f6d..1b3c508 100644
--- a/example/get-all-properties.cpp
+++ b/example/get-all-properties.cpp
@@ -64,12 +64,10 @@
         return fatalErrors_;
     }
 
-    auto logSystemErrorCode()
+    auto logSystemErrorCode(boost::system::error_code ec)
     {
-        return [this](boost::system::error_code ec) {
-            std::cerr << "Error: " << ec << "\n";
-            ++fatalErrors_;
-        };
+        std::cerr << "Error: " << ec << "\n";
+        ++fatalErrors_;
     }
 
     void logException(const std::exception& e)
@@ -90,10 +88,15 @@
     {
         sdbusplus::asio::getAllProperties(
             bus_, xyz::demo::name, xyz::demo::path, xyz::demo::interface,
-            logSystemErrorCode(),
-            [this](std::vector<std::pair<
+            [this](boost::system::error_code ec,
+                   std::vector<std::pair<
                        std::string, std::variant<std::monostate, std::string>>>&
-                       properties) {
+                       properties) -> void {
+                if (ec)
+                {
+                    logSystemErrorCode(ec);
+                    return;
+                }
                 try
                 {
                     std::string greetings;
@@ -130,11 +133,16 @@
     {
         sdbusplus::asio::getAllProperties(
             bus_, xyz::demo::name, xyz::demo::path, xyz::demo::interface,
-            logSystemErrorCode(),
-            [this](
-                std::vector<std::pair<std::string,
-                                      std::variant<std::monostate, std::string,
-                                                   uint32_t>>>& properties) {
+            [this](boost::system::error_code ec,
+                   std::vector<std::pair<
+                       std::string,
+                       std::variant<std::monostate, std::string, uint32_t>>>&
+                       properties) -> void {
+                if (ec)
+                {
+                    logSystemErrorCode(ec);
+                    return;
+                }
                 try
                 {
                     std::string greetings;
diff --git a/example/register-property.cpp b/example/register-property.cpp
index 6fd4c89..a95181c 100644
--- a/example/register-property.cpp
+++ b/example/register-property.cpp
@@ -39,20 +39,18 @@
         service_(service), path_(path), interface_(interface), name_(name)
     {}
 
-    template <class OnError, class OnSuccess>
-    void async_get(OnError&& onError, OnSuccess&& onSuccess)
+    template <class Handler>
+    void async_get(Handler&& handler)
     {
         sdbusplus::asio::getProperty<T>(bus_, service_, path_, interface_,
-                                        name_, std::forward<OnError>(onError),
-                                        std::forward<OnSuccess>(onSuccess));
+                                        name_, std::forward<Handler>(handler));
     }
 
-    template <class OnError, class OnSuccess>
-    void async_set(const T& value, OnError&& onError, OnSuccess&& onSuccess)
+    template <class Handler>
+    void async_set(const T& value, Handler&& handler)
     {
         sdbusplus::asio::setProperty(bus_, service_, path_, interface_, name_,
-                                     value, std::forward<OnError>(onError),
-                                     std::forward<OnSuccess>(onSuccess));
+                                     value, std::forward<Handler>(handler));
     }
 
   private:
@@ -112,12 +110,15 @@
             name::greetings};
 
         propertyWithWrongType.async_get(
-            [](boost::system::error_code error) {
-                std::cout
-                    << "As expected failed to getProperty with wrong type: "
-                    << error << "\n";
-            },
-            [this](uint32_t) {
+            [this](boost::system::error_code error, uint32_t) {
+                if (error)
+                {
+                    std::cout
+                        << "As expected failed to getProperty with wrong type: "
+                        << error << "\n";
+                    return;
+                }
+
                 std::cerr << "Error: it was expected to fail getProperty due "
                              "to wrong type\n";
                 ++fatalErrors_;
@@ -126,38 +127,55 @@
 
     void asyncReadProperties()
     {
-        propertyGreetings.async_get(getFailed(), [](std::string value) {
-            std::cout << "Greetings value is: " << value << "\n";
-        });
+        propertyGreetings.async_get(
+            [this](boost::system::error_code ec, std::string value) {
+                if (ec)
+                {
+                    getFailed();
+                    return;
+                }
+                std::cout << "Greetings value is: " << value << "\n";
+            });
 
-        propertyGoodbyes.async_get(getFailed(), [](std::string value) {
-            std::cout << "Goodbyes value is: " << value << "\n";
-        });
+        propertyGoodbyes.async_get(
+            [this](boost::system::error_code ec, std::string value) {
+                if (ec)
+                {
+                    getFailed();
+                    return;
+                }
+                std::cout << "Goodbyes value is: " << value << "\n";
+            });
     }
 
     void asyncChangeProperty()
     {
         propertyGreetings.async_set(
-            "Hi, hey, hello",
-            [](const boost::system::error_code& error) {
-                std::cout << "As expected, failed to set greetings property: "
-                          << error << "\n";
-            },
-            [this]() {
+            "Hi, hey, hello", [this](const boost::system::error_code& error) {
+                if (error)
+                {
+                    std::cout
+                        << "As expected, failed to set greetings property: "
+                        << error << "\n";
+                    return;
+                }
+
                 std::cout
                     << "Error: it was expected to fail to change greetings\n";
                 ++fatalErrors_;
             });
 
         propertyGoodbyes.async_set(
-            "Bye bye",
-            [this](const boost::system::error_code& error) {
-                std::cout << "Error: it supposed to be ok to change goodbyes "
-                             "property: "
-                          << error << "\n";
-                ++fatalErrors_;
-            },
-            [this]() {
+            "Bye bye", [this](const boost::system::error_code& error) {
+                if (error)
+                {
+                    std::cout
+                        << "Error: it supposed to be ok to change goodbyes "
+                           "property: "
+                        << error << "\n";
+                    ++fatalErrors_;
+                    return;
+                }
                 std::cout << "Changed goodbyes property as expected\n";
                 boost::asio::post(ioc_, [this] { asyncReadProperties(); });
             });
diff --git a/include/sdbusplus/asio/property.hpp b/include/sdbusplus/asio/property.hpp
index da34325..148bf15 100644
--- a/include/sdbusplus/asio/property.hpp
+++ b/include/sdbusplus/asio/property.hpp
@@ -5,38 +5,56 @@
 namespace sdbusplus::asio
 {
 
-template <typename OnError, typename OnSuccess>
+template <typename Handler>
 inline void getAllProperties(sdbusplus::asio::connection& bus,
                              const std::string& service,
                              const std::string& path,
-                             const std::string& interface, OnError&& onError,
-                             OnSuccess&& onSuccess)
+                             const std::string& interface, Handler&& handler)
 {
-    using FunctionTuple = boost::callable_traits::args_t<OnSuccess>;
-    using FunctionTupleType =
-        typename sdbusplus::utility::decay_tuple<FunctionTuple>::type;
-
-    bus.async_method_call(
-        [onError = std::move(onError), onSuccess = std::move(onSuccess)](
-            boost::system::error_code ec,
-            std::tuple_element_t<0, FunctionTupleType>& ret) {
-            if (ec)
-            {
-                onError(ec);
-                return;
-            }
-
-            onSuccess(ret);
-        },
-        service, path, "org.freedesktop.DBus.Properties", "GetAll", interface);
+    bus.async_method_call(std::forward<Handler>(handler), service, path,
+                          "org.freedesktop.DBus.Properties", "GetAll",
+                          interface);
 }
 
-template <typename T, typename OnError, typename OnSuccess>
+template <typename T, typename Handler>
 inline void getProperty(sdbusplus::asio::connection& bus,
                         const std::string& service, const std::string& path,
                         const std::string& interface,
-                        const std::string& propertyName, OnError&& onError,
-                        OnSuccess&& onSuccess)
+                        const std::string& propertyName, Handler&& handler)
+{
+    bus.async_method_call(
+        [handler = std::forward<Handler>(handler)](
+            boost::system::error_code ec,
+            std::variant<std::monostate, T>& ret) {
+            if (ec)
+            {
+                handler(ec, {});
+                return;
+            }
+
+            if (T* value = std::get_if<T>(&ret))
+            {
+                handler(ec, *value);
+                return;
+            }
+
+            handler(boost::system::errc::make_error_code(
+                        boost::system::errc::invalid_argument),
+                    {});
+        },
+        service, path, "org.freedesktop.DBus.Properties", "Get", interface,
+        propertyName);
+}
+
+/* This method has been deprecated, and will be removed in a future revision.
+ * Use the getProperty overload above to make equivalent calls
+ */
+template <typename T, typename OnError, typename OnSuccess>
+[[deprecated]] inline void
+    getProperty(sdbusplus::asio::connection& bus, const std::string& service,
+                const std::string& path, const std::string& interface,
+                const std::string& propertyName, OnError&& onError,
+                OnSuccess&& onSuccess)
 {
     bus.async_method_call(
         [onError = std::move(onError), onSuccess = std::move(onSuccess)](
@@ -61,26 +79,16 @@
         propertyName);
 }
 
-template <typename T, typename OnError, typename OnSuccess>
+template <typename T, typename Handler>
 inline void setProperty(sdbusplus::asio::connection& bus,
                         const std::string& service, const std::string& path,
                         const std::string& interface,
                         const std::string& propertyName, T&& propertyValue,
-                        OnError&& onError, OnSuccess&& onSuccess)
+                        Handler&& handler)
 {
     bus.async_method_call(
-        [onError = std::move(onError),
-         onSuccess = std::move(onSuccess)](boost::system::error_code ec) {
-            if (ec)
-            {
-                onError(ec);
-                return;
-            }
-
-            onSuccess();
-        },
-        service, path, "org.freedesktop.DBus.Properties", "Set", interface,
-        propertyName,
+        std::forward<Handler>(handler), service, path,
+        "org.freedesktop.DBus.Properties", "Set", interface, propertyName,
         std::variant<std::decay_t<T>>(std::forward<T>(propertyValue)));
 }
 
