incremental
diff --git a/boost-dbus/include/dbus/connection_service.hpp b/boost-dbus/include/dbus/connection_service.hpp
new file mode 100644
index 0000000..28318c6
--- /dev/null
+++ b/boost-dbus/include/dbus/connection_service.hpp
@@ -0,0 +1,105 @@
+// Copyright (c) Benjamin Kietzman (github.com/bkietz)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef DBUS_CONNECTION_SERVICE_HPP
+#define DBUS_CONNECTION_SERVICE_HPP
+
+#include <boost/asio.hpp>
+#include <boost/asio/io_service.hpp>
+
+#include <dbus/detail/async_send_op.hpp>
+#include <dbus/element.hpp>
+#include <dbus/error.hpp>
+#include <dbus/message.hpp>
+
+#include <dbus/impl/connection.ipp>
+
+namespace dbus {
+namespace bus {
+static const int session = DBUS_BUS_SESSION;
+static const int system = DBUS_BUS_SYSTEM;
+static const int starter = DBUS_BUS_STARTER;
+}  // namespace bus
+
+class filter;
+class match;
+class connection;
+
+class connection_service : public boost::asio::detail::service_base<connection_service> {
+ public:
+  typedef impl::connection implementation_type;
+
+  inline explicit connection_service(boost::asio::io_service& io)
+      : boost::asio::detail::service_base<connection_service>(io) {}
+
+  inline void construct(implementation_type& impl) {}
+
+  inline void destroy(implementation_type& impl) {}
+
+  inline void shutdown_service() {
+    // TODO is there anything that needs shutting down?
+  }
+
+  inline void open(implementation_type& impl, const string& address) {
+    boost::asio::io_service& io = this->get_io_service();
+
+    impl.open(io, address);
+  }
+
+  inline void open(implementation_type& impl, const int bus = bus::system) {
+    boost::asio::io_service& io = this->get_io_service();
+
+    impl.open(io, bus);
+  }
+
+  inline message send(implementation_type& impl, message& m) {
+    return impl.send_with_reply_and_block(m);
+  }
+
+  template <typename Duration>
+  inline message send(implementation_type& impl, message& m, const Duration& timeout) {
+    if (timeout == Duration::zero()) {
+      // TODO this can return false if it failed
+      impl.send(m);
+      return message();
+    } else {
+      return impl.send_with_reply_and_block(
+          m, std::chrono::milliseconds(timeout).count());
+    }
+  }
+
+  template <typename MessageHandler>
+  inline BOOST_ASIO_INITFN_RESULT_TYPE(MessageHandler,
+                                       void(boost::system::error_code, message))
+      async_send(implementation_type& impl, message& m,
+                 BOOST_ASIO_MOVE_ARG(MessageHandler) handler) {
+    // begin asynchronous operation
+    impl.start(this->get_io_service());
+
+    boost::asio::detail::async_result_init<
+        MessageHandler, void(boost::system::error_code, message)>
+        init(BOOST_ASIO_MOVE_CAST(MessageHandler)(handler));
+    detail::async_send_op<typename boost::asio::handler_type<
+        MessageHandler, void(boost::system::error_code, message)>::type>(
+        this->get_io_service(),
+        BOOST_ASIO_MOVE_CAST(MessageHandler)(init.handler))(impl, m);
+
+    return init.result.get();
+  }
+
+ private:
+  friend connection;
+  inline void new_match(implementation_type& impl, match& m);
+
+  inline void delete_match(implementation_type& impl, match& m);
+
+  inline void new_filter(implementation_type& impl, filter& f);
+
+  inline void delete_filter(implementation_type& impl, filter& f);
+};
+
+}  // namespace dbus
+
+#endif  // DBUS_CONNECTION_SERVICE_HPP