diff --git a/gio/gdbusobjectmanagerserver.c b/gio/gdbusobjectmanagerserver.c
index c9a2673..cd2900f 100644
--- a/gio/gdbusobjectmanagerserver.c
+++ b/gio/gdbusobjectmanagerserver.c
@@ -62,31 +62,47 @@ typedef struct
   gboolean exported;
 } RegistrationData;
 
-static void registration_data_free (RegistrationData *data);
+typedef struct {
+  GDBusConnection *connection;
+  guint            registration_id;
+} ConnectionData;
 
-static void export_all (GDBusObjectManagerServer *manager);
-static void unexport_all (GDBusObjectManagerServer *manager, gboolean only_manager);
+static void registration_data_free (RegistrationData *data);
 
 static void g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *manager,
-                                                         RegistrationData   *data,
-                                                         const gchar *const *interfaces,
-                                                         const gchar *object_path);
+								GDBusConnection    *connection,
+								RegistrationData   *data,
+								const gchar *const *interfaces,
+								const gchar *object_path);
 
 static void g_dbus_object_manager_server_emit_interfaces_removed (GDBusObjectManagerServer *manager,
-                                                           RegistrationData   *data,
-                                                           const gchar *const *interfaces);
-
-static gboolean g_dbus_object_manager_server_unexport_unlocked (GDBusObjectManagerServer  *manager,
-                                                                const gchar               *object_path);
+								  RegistrationData   *data,
+								  const gchar *const *interfaces);
+
+static gboolean g_dbus_object_manager_server_unexport_locked     (GDBusObjectManagerServer  *manager,
+								  const gchar               *object_path);
+static void g_dbus_object_manager_server_set_connection_internal (GDBusObjectManagerServer  *manager,
+								  GDBusConnection           *connection);
+
+static void     export_objects_locked                            (GDBusObjectManagerServer  *manager,
+								  GDBusConnection           *connection);
+static void     unexport_objects_locked                          (GDBusObjectManagerServer  *manager,
+								  GDBusConnection           *connection);
+static void     add_connection_locked                            (GDBusObjectManagerServer  *manager,
+								  GDBusConnection           *connection);
+static void     remove_connection_locked                         (GDBusObjectManagerServer  *manager,
+								  GDBusConnection           *connection,
+								  gboolean                   unexport_objects);
+static gboolean has_connection_locked                            (GDBusObjectManagerServer  *manager,
+								  GDBusConnection           *connection);
 
 struct _GDBusObjectManagerServerPrivate
 {
-  GMutex lock;
-  GDBusConnection *connection;
-  gchar *object_path;
-  gchar *object_path_ending_in_slash;
+  GMutex      lock;
+  gchar      *object_path;
+  gchar      *object_path_ending_in_slash;
   GHashTable *map_object_path_to_data;
-  guint manager_reg_id;
+  GSList     *connections;
 };
 
 enum
@@ -106,18 +122,23 @@ static void g_dbus_object_manager_server_constructed (GObject *object);
 static void
 g_dbus_object_manager_server_finalize (GObject *object)
 {
-  GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object);
+  GDBusObjectManagerServer        *manager = G_DBUS_OBJECT_MANAGER_SERVER (object);
+  GDBusObjectManagerServerPrivate *priv    = manager->priv;
 
-  if (manager->priv->connection != NULL)
+  /* unexport from all connections if we're exported anywhere */
+  while (priv->connections != NULL)
     {
-      unexport_all (manager, TRUE);
-      g_object_unref (manager->priv->connection);
+      ConnectionData *data = priv->connections->data;
+
+      /* Dont unexport the interface skeleton objects here */
+      remove_connection_locked (manager, data->connection, FALSE);
     }
-  g_hash_table_unref (manager->priv->map_object_path_to_data);
-  g_free (manager->priv->object_path);
-  g_free (manager->priv->object_path_ending_in_slash);
 
-  g_mutex_clear (&manager->priv->lock);
+  g_hash_table_unref (priv->map_object_path_to_data);
+  g_free (priv->object_path);
+  g_free (priv->object_path_ending_in_slash);
+
+  g_mutex_clear (&priv->lock);
 
   if (G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->finalize != NULL)
     G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->finalize (object);
@@ -130,12 +151,20 @@ g_dbus_object_manager_server_get_property (GObject    *object,
                                            GParamSpec *pspec)
 {
   GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object);
+  ConnectionData           *data;
+  GObject                  *obj;
 
   switch (prop_id)
     {
     case PROP_CONNECTION:
       g_mutex_lock (&manager->priv->lock);
-      g_value_set_object (value, manager->priv->connection);
+      obj = NULL;
+      if (manager->priv->connections)
+	{
+	  data = manager->priv->connections->data;
+	  obj  = (GObject *)data->connection;
+	}
+      g_value_set_object (value, obj);
       g_mutex_unlock (&manager->priv->lock);
       break;
 
@@ -160,7 +189,7 @@ g_dbus_object_manager_server_set_property (GObject       *object,
   switch (prop_id)
     {
     case PROP_CONNECTION:
-      g_dbus_object_manager_server_set_connection (manager, g_value_get_object (value));
+      g_dbus_object_manager_server_set_connection_internal (manager, g_value_get_object (value));
       break;
 
     case PROP_OBJECT_PATH:
@@ -191,7 +220,7 @@ g_dbus_object_manager_server_class_init (GDBusObjectManagerServerClass *klass)
    *
    * The #GDBusConnection to export objects on.
    *
-   * Since: 2.30
+   * Deprecated: 2.32: Consult g_dbus_object_manager_server_get_connections() instead.
    */
   g_object_class_install_property (gobject_class,
                                    PROP_CONNECTION,
@@ -263,38 +292,137 @@ g_dbus_object_manager_server_new (const gchar     *object_path)
 }
 
 /**
- * g_dbus_object_manager_server_set_connection:
+ * g_dbus_object_manager_server_add_connection:
  * @manager: A #GDBusObjectManagerServer.
  * @connection: (allow-none): A #GDBusConnection or %NULL.
  *
- * Exports all objects managed by @manager on @connection. If
- * @connection is %NULL, stops exporting objects.
+ * Exports all objects managed by @manager on @connection.
+ *
+ * To stop exporting objects managed by @manager on @connection,
+ * call g_dbus_object_manager_server_remove_connection().
  */
 void
-g_dbus_object_manager_server_set_connection (GDBusObjectManagerServer  *manager,
-                                             GDBusConnection           *connection)
+g_dbus_object_manager_server_add_connection (GDBusObjectManagerServer  *manager,
+					     GDBusConnection           *connection)
 {
   g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager));
-  g_return_if_fail (connection == NULL || G_IS_DBUS_CONNECTION (connection));
+  g_return_if_fail (G_IS_DBUS_CONNECTION (connection));
+
+  g_mutex_lock (&manager->priv->lock);
+  add_connection_locked (manager, connection);
+  g_mutex_unlock (&manager->priv->lock);
+}
+
+/**
+ * g_dbus_object_manager_server_remove_connection:
+ * @manager: A #GDBusObjectManagerServer.
+ * @connection: (allow-none): A #GDBusConnection or %NULL.
+ *
+ * Stops exporting all objects managed by @manager on @connection.
+ */
+void
+g_dbus_object_manager_server_remove_connection (GDBusObjectManagerServer  *manager,
+						GDBusConnection           *connection)
+{
+  g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager));
+  g_return_if_fail (G_IS_DBUS_CONNECTION (connection));
+
+  g_mutex_lock (&manager->priv->lock);
+  remove_connection_locked (manager, connection, TRUE);
+  g_mutex_unlock (&manager->priv->lock);
+}
+
+/**
+ * g_dbus_object_manager_server_get_connections:
+ * @manager: A #GDBusObjectManagerServer.
+ *
+ * Reports all the connections that @interface_ is exported
+ * on via g_dbus_object_manager_server_export().
+ *
+ * Returns: (element-type GDBusConnection) (transfer full):
+ *   A newly allocated #GSList of #GDBusConnections all of wich
+ *   should eventually be released with g_object_unref() and
+ *   the list freed with g_slist_free().
+ *
+ * Since: 2.32
+ */
+GSList *
+g_dbus_object_manager_server_get_connections (GDBusObjectManagerServer *interface_)
+{
+  GSList          *list, *connections;
+  ConnectionData  *data;
+
+  g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (interface_), NULL);
+
+  g_mutex_lock (&interface_->priv->lock);
+  connections = NULL;
+
+  for (list = interface_->priv->connections; list; list = list->next)
+    {
+      data        = list->data;
+      connections = g_slist_prepend (connections,
+				     /* Return a reference to each connection */
+				     g_object_ref (data->connection));
+    }
+
+  g_mutex_unlock (&interface_->priv->lock);
 
+  return g_slist_reverse (connections);
+}
+
+/**
+ * g_dbus_object_manager_server_has_connection:
+ * @manager: A #GDBusObjectManagerServer.
+ * @connection: The #GDBusConnection to check
+ *
+ * Checks if @connection has been added to @manager
+ * with g_dbus_object_manager_server_add_connection()
+ *
+ * Returns: whether @manager is managing objects on @connection
+ *
+ * Since: 2.32
+ */
+gboolean
+g_dbus_object_manager_server_has_connection (GDBusObjectManagerServer   *manager,
+					     GDBusConnection            *connection)
+{
+  gboolean ret;
+
+  g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), FALSE);
+  g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE);
+
+  g_mutex_lock (&manager->priv->lock);
+  ret = has_connection_locked (manager, connection);
+  g_mutex_unlock (&manager->priv->lock);
+
+  return ret;
+}
+
+
+/* We need to call this while handling the deprecated 'connection' property,
+ * so we need to use a different symbol which wont cause warnings while compiling */
+static void
+g_dbus_object_manager_server_set_connection_internal (GDBusObjectManagerServer  *manager,
+						      GDBusConnection           *connection)
+{
   g_mutex_lock (&manager->priv->lock);
 
-  if (manager->priv->connection == connection)
+  if (has_connection_locked (manager, connection))
     {
       g_mutex_unlock (&manager->priv->lock);
       goto out;
     }
 
-  if (manager->priv->connection != NULL)
+  /* Remove all connections */
+  while (manager->priv->connections != NULL)
     {
-      unexport_all (manager, FALSE);
-      g_object_unref (manager->priv->connection);
-      manager->priv->connection = NULL;
+      ConnectionData *data = manager->priv->connections->data;
+
+      remove_connection_locked (manager, data->connection, TRUE);
     }
 
-  manager->priv->connection = connection != NULL ? g_object_ref (connection) : NULL;
-  if (manager->priv->connection != NULL)
-    export_all (manager);
+  /* Add the new connection */
+  add_connection_locked (manager, connection);
 
   g_mutex_unlock (&manager->priv->lock);
 
@@ -304,24 +432,55 @@ g_dbus_object_manager_server_set_connection (GDBusObjectManagerServer  *manager,
 }
 
 /**
+ * g_dbus_object_manager_server_set_connection:
+ * @manager: A #GDBusObjectManagerServer.
+ * @connection: (allow-none): A #GDBusConnection or %NULL.
+ *
+ * Exports all objects managed by @manager on @connection. If
+ * @connection is %NULL this will remove any connections previosly
+ * added.
+ *
+ * Deprecated: 2.32: Use g_dbus_object_manager_server_add_connection() and
+ * g_dbus_object_manager_server_remove_connection() instead.
+ */
+void
+g_dbus_object_manager_server_set_connection (GDBusObjectManagerServer  *manager,
+                                             GDBusConnection           *connection)
+{
+  g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager));
+  g_return_if_fail (connection == NULL || G_IS_DBUS_CONNECTION (connection));
+
+  g_dbus_object_manager_server_set_connection_internal (manager, connection);
+}
+
+/**
  * g_dbus_object_manager_server_get_connection:
  * @manager: A #GDBusObjectManagerServer
  *
- * Gets the #GDBusConnection used by @manager.
+ * Gets the first #GDBusConnection in the list of connections used by @manager.
  *
  * Returns: (transfer full): A #GDBusConnection object or %NULL if
  *   @manager isn't exported on a connection. The returned object should
  *   be freed with g_object_unref().
  *
- * Since: 2.30
+ * Deprecated: 2.32: Use g_dbus_object_manager_server_get_connections() instead.
  */
 GDBusConnection *
 g_dbus_object_manager_server_get_connection (GDBusObjectManagerServer *manager)
 {
   GDBusConnection *ret;
+  ConnectionData  *data;
   g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), NULL);
   g_mutex_lock (&manager->priv->lock);
-  ret = manager->priv->connection != NULL ? g_object_ref (manager->priv->connection) : NULL;
+
+  if (manager->priv->connections)
+    {
+      data = manager->priv->connections->data;
+      ret  = g_object_ref (data->connection);
+    }
+  else
+    ret = NULL;
+
   g_mutex_unlock (&manager->priv->lock);
   return ret;
 }
@@ -334,23 +493,26 @@ registration_data_export_interface (RegistrationData        *data,
                                     const gchar             *object_path)
 {
   GDBusInterfaceInfo *info;
-  GError *error;
+  GSList *list;
+  GError *error = NULL;
 
   info = g_dbus_interface_skeleton_get_info (interface_skeleton);
-  error = NULL;
-  if (data->manager->priv->connection != NULL)
+
+  for (list = data->manager->priv->connections; list; list = list->next)
     {
+      ConnectionData *connection_data = list->data;
+
       if (!g_dbus_interface_skeleton_export (interface_skeleton,
-                                             data->manager->priv->connection,
-                                             object_path,
-                                             &error))
+					     connection_data->connection,
+					     data->manager->priv->object_path,
+					     &error))
         {
           g_warning ("%s: Error registering object at %s with interface %s: %s",
                      G_STRLOC,
                      object_path,
                      info->name,
                      error->message);
-          g_error_free (error);
+          g_clear_error (&error);
         }
     }
 
@@ -366,7 +528,7 @@ registration_data_export_interface (RegistrationData        *data,
       /* emit InterfacesAdded on the ObjectManager object */
       interfaces[0] = info->name;
       interfaces[1] = NULL;
-      g_dbus_object_manager_server_emit_interfaces_added (data->manager, data, interfaces, object_path);
+      g_dbus_object_manager_server_emit_interfaces_added (data->manager, NULL, data, interfaces, object_path);
     }
 }
 
@@ -376,13 +538,18 @@ registration_data_unexport_interface (RegistrationData       *data,
 {
   GDBusInterfaceInfo *info;
   GDBusInterfaceSkeleton *iface;
+  GSList *list;
 
   info = g_dbus_interface_skeleton_get_info (interface_skeleton);
   iface = g_hash_table_lookup (data->map_iface_name_to_iface, info->name);
   g_assert (iface != NULL);
 
-  if (data->manager->priv->connection != NULL)
-    g_dbus_interface_skeleton_unexport (iface);
+  for (list = data->manager->priv->connections; list; list = list->next)
+    {
+      ConnectionData *connection_data = list->data;
+
+      g_dbus_interface_skeleton_unexport_from_connection (iface, connection_data->connection);
+    }
 
   g_warn_if_fail (g_hash_table_remove (data->map_iface_name_to_iface, info->name));
 
@@ -437,8 +604,13 @@ registration_data_free (RegistrationData *data)
   g_hash_table_iter_init (&iter, data->map_iface_name_to_iface);
   while (g_hash_table_iter_next (&iter, NULL, (gpointer) &iface))
     {
-      if (data->manager->priv->connection != NULL)
-        g_dbus_interface_skeleton_unexport (iface);
+      GSList *list;
+
+      for (list = data->manager->priv->connections; list; list = list->next)
+	{
+	  ConnectionData *connection_data = list->data;
+	  g_dbus_interface_skeleton_unexport_from_connection (iface, connection_data->connection);
+	}
     }
 
   g_signal_handlers_disconnect_by_func (data->object, G_CALLBACK (on_interface_added), data);
@@ -450,10 +622,11 @@ registration_data_free (RegistrationData *data)
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+/* Must be called with the lock held */
 static void
-g_dbus_object_manager_server_export_unlocked (GDBusObjectManagerServer  *manager,
-                                              GDBusObjectSkeleton       *object,
-                                              const gchar               *object_path)
+g_dbus_object_manager_server_export_locked (GDBusObjectManagerServer  *manager,
+					    GDBusObjectSkeleton       *object,
+					    const gchar               *object_path)
 {
   RegistrationData *data;
   GList *existing_interfaces;
@@ -468,7 +641,7 @@ g_dbus_object_manager_server_export_unlocked (GDBusObjectManagerServer  *manager
 
   data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path);
   if (data != NULL)
-    g_dbus_object_manager_server_unexport_unlocked (manager, object_path);
+    g_dbus_object_manager_server_unexport_locked (manager, object_path);
 
   data = g_new0 (RegistrationData, 1);
   data->object = g_object_ref (object);
@@ -504,7 +677,7 @@ g_dbus_object_manager_server_export_unlocked (GDBusObjectManagerServer  *manager
   data->exported = TRUE;
 
   /* now emit InterfacesAdded() for all the interfaces */
-  g_dbus_object_manager_server_emit_interfaces_added (manager, data, (const gchar *const *) interface_names->pdata, object_path);
+  g_dbus_object_manager_server_emit_interfaces_added (manager, NULL, data, (const gchar *const *) interface_names->pdata, object_path);
   g_ptr_array_unref (interface_names);
 
   g_hash_table_insert (manager->priv->map_object_path_to_data,
@@ -536,8 +709,8 @@ g_dbus_object_manager_server_export (GDBusObjectManagerServer  *manager,
 {
   g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager));
   g_mutex_lock (&manager->priv->lock);
-  g_dbus_object_manager_server_export_unlocked (manager, object,
-                                                g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
+  g_dbus_object_manager_server_export_locked (manager, object,
+					      g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
   g_mutex_unlock (&manager->priv->lock);
 }
 
@@ -587,7 +760,7 @@ g_dbus_object_manager_server_export_uniquely (GDBusObjectManagerServer *manager,
       modified = TRUE;
     }
 
-  g_dbus_object_manager_server_export_unlocked (manager, object, object_path);
+  g_dbus_object_manager_server_export_locked (manager, object, object_path);
 
   g_mutex_unlock (&manager->priv->lock);
 
@@ -601,9 +774,10 @@ g_dbus_object_manager_server_export_uniquely (GDBusObjectManagerServer *manager,
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+/* Must be called with the lock held */
 static gboolean
-g_dbus_object_manager_server_unexport_unlocked (GDBusObjectManagerServer  *manager,
-                                                const gchar               *object_path)
+g_dbus_object_manager_server_unexport_locked (GDBusObjectManagerServer  *manager,
+					      const gchar               *object_path)
 {
   RegistrationData *data;
   gboolean ret;
@@ -659,7 +833,7 @@ g_dbus_object_manager_server_unexport (GDBusObjectManagerServer  *manager,
   gboolean ret;
   g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), FALSE);
   g_mutex_lock (&manager->priv->lock);
-  ret = g_dbus_object_manager_server_unexport_unlocked (manager, object_path);
+  ret = g_dbus_object_manager_server_unexport_locked (manager, object_path);
   g_mutex_unlock (&manager->priv->lock);
   return ret;
 }
@@ -855,10 +1029,11 @@ static const GDBusInterfaceVTable manager_interface_vtable =
 static void
 g_dbus_object_manager_server_constructed (GObject *object)
 {
-  GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object);
+  /* GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); */
 
-  if (manager->priv->connection != NULL)
-    export_all (manager);
+  /* Bah, lets get rid of this... */
+  /* if (manager->priv->connection != NULL) */
+  /*   export_all (manager); */
 
   if (G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->constructed != NULL)
     G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->constructed (object);
@@ -866,15 +1041,21 @@ g_dbus_object_manager_server_constructed (GObject *object)
 
 static void
 g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *manager,
-                                                    RegistrationData   *data,
+						    GDBusConnection          *connection,
+                                                    RegistrationData         *data,
                                                     const gchar *const *interfaces,
                                                     const gchar *object_path)
 {
   GVariantBuilder array_builder;
   GError *error;
+  GVariant *signal_variant;
+  GSList *list;
   guint n;
 
-  if (data->manager->priv->connection == NULL)
+  g_print ("emitting interfaces added with '%d' connections\n",
+	   data->manager->priv->connections ? g_slist_length (data->manager->priv->connections) : 0);
+
+  if (connection == NULL && data->manager->priv->connections == NULL)
     goto out;
 
   g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a{sa{sv}}"));
@@ -891,16 +1072,37 @@ g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *ma
     }
 
   error = NULL;
-  g_dbus_connection_emit_signal (data->manager->priv->connection,
-                                 NULL, /* destination_bus_name */
-                                 manager->priv->object_path,
-                                 manager_interface_info.name,
-                                 "InterfacesAdded",
-                                 g_variant_new ("(oa{sa{sv}})",
-                                                object_path,
-                                                &array_builder),
-                                 &error);
+
+  signal_variant = g_variant_new ("(oa{sa{sv}})",
+				  object_path,
+				  &array_builder);
+  g_variant_ref_sink (signal_variant);
+
+  if (connection != NULL)
+      g_dbus_connection_emit_signal (connection,
+				     NULL, /* destination_bus_name */
+				     manager->priv->object_path,
+				     manager_interface_info.name,
+				     "InterfacesAdded", signal_variant,
+				     &error);
+  else
+    {
+      for (list = data->manager->priv->connections; list != NULL; list = list->next)
+	{
+	  ConnectionData *connection_data = list->data;
+
+	  g_dbus_connection_emit_signal (connection_data->connection,
+					 NULL, /* destination_bus_name */
+					 manager->priv->object_path,
+					 manager_interface_info.name,
+					 "InterfacesAdded", signal_variant,
+					 &error);
+	}
+    }
   g_assert_no_error (error);
+
+  g_variant_unref (signal_variant);
+
  out:
   ;
 }
@@ -912,10 +1114,12 @@ g_dbus_object_manager_server_emit_interfaces_removed (GDBusObjectManagerServer *
 {
   GVariantBuilder array_builder;
   GError *error;
+  GVariant *signal_variant;
+  GSList *list;
   guint n;
   const gchar *object_path;
 
-  if (data->manager->priv->connection == NULL)
+  if (data->manager->priv->connections == NULL)
     goto out;
 
   g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("as"));
@@ -924,16 +1128,25 @@ g_dbus_object_manager_server_emit_interfaces_removed (GDBusObjectManagerServer *
 
   error = NULL;
   object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object));
-  g_dbus_connection_emit_signal (data->manager->priv->connection,
-                                 NULL, /* destination_bus_name */
-                                 manager->priv->object_path,
-                                 manager_interface_info.name,
-                                 "InterfacesRemoved",
-                                 g_variant_new ("(oas)",
-                                                object_path,
-                                                &array_builder),
-                                 &error);
-  g_assert_no_error (error);
+
+  signal_variant = g_variant_new ("(oas)", object_path, &array_builder);
+  g_variant_ref_sink (signal_variant);
+
+  for (list = data->manager->priv->connections; list; list = list->next)
+    {
+      ConnectionData *connection_data = list->data;
+
+      g_dbus_connection_emit_signal (connection_data->connection,
+				     NULL, /* destination_bus_name */
+				     manager->priv->object_path,
+				     manager_interface_info.name,
+				     "InterfacesRemoved",
+				     signal_variant,
+				     &error);
+      g_assert_no_error (error);
+    }
+  g_variant_unref (signal_variant);
+
  out:
   ;
 }
@@ -1020,92 +1233,196 @@ dbus_object_manager_interface_init (GDBusObjectManagerIface *iface)
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+
+static ConnectionData *
+new_connection (GDBusConnection *connection,
+		guint            registration_id)
+{
+  ConnectionData *data;
+
+  data = g_slice_new0 (ConnectionData);
+  data->connection      = g_object_ref (connection);
+  data->registration_id = registration_id;
+
+  return data;
+}
+
+static void
+free_connection (ConnectionData *data)
+{
+  if (data)
+    {
+      g_object_unref (data->connection);
+      g_slice_free (ConnectionData, data);
+    }
+}
+
 static void
-export_all (GDBusObjectManagerServer *manager)
+export_objects_locked (GDBusObjectManagerServer *manager,
+		       GDBusConnection          *connection)
 {
   GHashTableIter iter;
   const gchar *object_path;
   RegistrationData *data;
   GHashTableIter iface_iter;
   GDBusInterfaceSkeleton *iface;
-  GError *error;
+  GError *error = NULL;
+  GPtrArray *interface_names = NULL;
 
-  g_return_if_fail (manager->priv->connection != NULL);
-
-  error = NULL;
-  g_warn_if_fail (manager->priv->manager_reg_id == 0);
-  manager->priv->manager_reg_id = g_dbus_connection_register_object (manager->priv->connection,
-                                                                     manager->priv->object_path,
-                                                                     (GDBusInterfaceInfo *) &manager_interface_info,
-                                                                     &manager_interface_vtable,
-                                                                     manager,
-                                                                     NULL, /* user_data_free_func */
-                                                                     &error);
-  if (manager->priv->manager_reg_id == 0)
-    {
-      g_warning ("%s: Error registering manager at %s: %s",
-                 G_STRLOC,
-                 manager->priv->object_path,
-                 error->message);
-      g_error_free (error);
-    }
 
   g_hash_table_iter_init (&iter, manager->priv->map_object_path_to_data);
   while (g_hash_table_iter_next (&iter, (gpointer) &object_path, (gpointer) &data))
     {
       g_hash_table_iter_init (&iface_iter, data->map_iface_name_to_iface);
+
+      if (data->exported)
+	interface_names = g_ptr_array_new ();
+      else
+	interface_names = NULL;
+
       while (g_hash_table_iter_next (&iface_iter, NULL, (gpointer) &iface))
         {
-          g_warn_if_fail (g_dbus_interface_skeleton_get_connection (iface) == NULL);
-          error = NULL;
-          if (!g_dbus_interface_skeleton_export (iface,
-                                                 manager->priv->connection,
-                                                 object_path,
-                                                 &error))
-            {
+          g_warn_if_fail (g_dbus_interface_skeleton_has_connection (iface, connection) == FALSE);
+
+	  if (g_dbus_interface_skeleton_export (iface,
+						connection,
+						object_path,
+						&error))
+	    {
+	      if (interface_names)
+		{
+		  g_print ("Going to notify interface added: '%s'\n",
+			   g_dbus_interface_skeleton_get_info (iface)->name);
+		  g_ptr_array_add (interface_names, g_dbus_interface_skeleton_get_info (iface)->name);
+		}
+	    }
+	  else
+	    {
               g_warning ("%s: Error registering object at %s with interface %s: %s",
                          G_STRLOC,
                          object_path,
                          g_dbus_interface_skeleton_get_info (iface)->name,
                          error->message);
-              g_error_free (error);
-            }
+              g_clear_error (&error);
+
+
+	    }
         }
+
+      /* If the object is already exported then we better emit the InterfacesAdded() on the new connection */
+      if (interface_names)
+	{
+	  g_ptr_array_add (interface_names, NULL);
+	  g_dbus_object_manager_server_emit_interfaces_added (manager, connection, data,
+							      (const gchar *const *) interface_names->pdata,
+							      object_path);
+	  g_ptr_array_unref (interface_names);
+	}
     }
 }
 
 static void
-unexport_all (GDBusObjectManagerServer *manager, gboolean only_manager)
+unexport_objects_locked (GDBusObjectManagerServer *manager,
+			 GDBusConnection          *connection)
 {
   GHashTableIter iter;
   RegistrationData *data;
   GHashTableIter iface_iter;
   GDBusInterfaceSkeleton *iface;
 
-  g_return_if_fail (manager->priv->connection != NULL);
-
-  g_warn_if_fail (manager->priv->manager_reg_id > 0);
-  if (manager->priv->manager_reg_id > 0)
-    {
-      g_warn_if_fail (g_dbus_connection_unregister_object (manager->priv->connection,
-                                                           manager->priv->manager_reg_id));
-      manager->priv->manager_reg_id = 0;
-    }
-  if (only_manager)
-    goto out;
-
   g_hash_table_iter_init (&iter, manager->priv->map_object_path_to_data);
   while (g_hash_table_iter_next (&iter, NULL, (gpointer) &data))
     {
       g_hash_table_iter_init (&iface_iter, data->map_iface_name_to_iface);
       while (g_hash_table_iter_next (&iface_iter, NULL, (gpointer) &iface))
         {
-          g_warn_if_fail (g_dbus_interface_skeleton_get_connection (iface) != NULL);
-          g_dbus_interface_skeleton_unexport (iface);
+          g_warn_if_fail (g_dbus_interface_skeleton_has_connection (iface, connection) != FALSE);
+
+          g_dbus_interface_skeleton_unexport_from_connection (iface, connection);
         }
     }
- out:
-  ;
 }
 
-/* ---------------------------------------------------------------------------------------------------- */
+static void
+add_connection_locked (GDBusObjectManagerServer *manager,
+		       GDBusConnection          *connection)
+{
+  GDBusObjectManagerServerPrivate *priv = manager->priv;
+  ConnectionData                  *data;
+  GError                          *error = NULL;
+  guint                            registration_id;
+
+  registration_id = g_dbus_connection_register_object (connection,
+						       priv->object_path,
+						       (GDBusInterfaceInfo *) &manager_interface_info,
+						       &manager_interface_vtable,
+						       manager,
+						       NULL, /* user_data_free_func */
+						       &error);
+
+  if (registration_id == 0)
+    {
+      g_warning ("%s: Error registering manager at %s: %s",
+                 G_STRLOC,
+                 manager->priv->object_path,
+                 error->message);
+      g_clear_error (&error);
+    }
+
+  data = new_connection (connection, registration_id);
+
+  priv->connections = g_slist_append (priv->connections, data);
+
+  export_objects_locked (manager, connection);
+}
+
+static void
+remove_connection_locked (GDBusObjectManagerServer *manager,
+			  GDBusConnection          *connection,
+			  gboolean                  unexport_objects)
+{
+  GDBusObjectManagerServerPrivate *priv;
+  ConnectionData                  *data;
+  GSList                          *list;
+
+  priv = manager->priv;
+
+  /* Get the connection in the list and unregister ... */
+  for (list = priv->connections; list; list = list->next)
+    {
+      data = list->data;
+
+      if (data->connection == connection)
+	{
+	  g_warn_if_fail
+	    (g_dbus_connection_unregister_object (data->connection, data->registration_id));
+
+	  free_connection (data);
+
+	  priv->connections =
+	    g_slist_delete_link (priv->connections, list);
+	}
+    }
+
+  if (unexport_objects)
+    unexport_objects_locked (manager, connection);
+}
+
+static gboolean
+has_connection_locked (GDBusObjectManagerServer   *manager,
+		       GDBusConnection            *connection)
+{
+  GSList *list;
+  gboolean ret = FALSE;
+
+  for (list = manager->priv->connections;
+       ret == FALSE && list != NULL;
+       list = list->next)
+    {
+      ConnectionData *data = list->data;
+
+      ret = (data->connection == connection);
+    }
+
+  return ret;
+}
diff --git a/gio/gdbusobjectmanagerserver.h b/gio/gdbusobjectmanagerserver.h
index 5abe00f..dc8832f 100644
--- a/gio/gdbusobjectmanagerserver.h
+++ b/gio/gdbusobjectmanagerserver.h
@@ -70,9 +70,15 @@ struct _GDBusObjectManagerServerClass
 
 GType                     g_dbus_object_manager_server_get_type            (void) G_GNUC_CONST;
 GDBusObjectManagerServer *g_dbus_object_manager_server_new                 (const gchar               *object_path);
-GDBusConnection          *g_dbus_object_manager_server_get_connection      (GDBusObjectManagerServer  *manager);
-void                      g_dbus_object_manager_server_set_connection      (GDBusObjectManagerServer  *manager,
+
+void                      g_dbus_object_manager_server_add_connection      (GDBusObjectManagerServer  *manager,
+                                                                            GDBusConnection           *connection);
+void                      g_dbus_object_manager_server_remove_connection   (GDBusObjectManagerServer  *manager,
+                                                                            GDBusConnection           *connection);
+gboolean                  g_dbus_object_manager_server_has_connection      (GDBusObjectManagerServer  *manager,
                                                                             GDBusConnection           *connection);
+GSList                   *g_dbus_object_manager_server_get_connections     (GDBusObjectManagerServer  *manager);
+
 void                      g_dbus_object_manager_server_export              (GDBusObjectManagerServer  *manager,
                                                                             GDBusObjectSkeleton       *object);
 void                      g_dbus_object_manager_server_export_uniquely     (GDBusObjectManagerServer  *manager,
@@ -80,6 +86,12 @@ void                      g_dbus_object_manager_server_export_uniquely     (GDBu
 gboolean                  g_dbus_object_manager_server_unexport            (GDBusObjectManagerServer  *manager,
                                                                             const gchar               *object_path);
 
+GLIB_DEPRECATED
+GDBusConnection          *g_dbus_object_manager_server_get_connection      (GDBusObjectManagerServer  *manager);
+GLIB_DEPRECATED
+void                      g_dbus_object_manager_server_set_connection      (GDBusObjectManagerServer  *manager,
+                                                                            GDBusConnection           *connection);
+
 G_END_DECLS
 
 #endif /* __G_DBUS_OBJECT_MANAGER_SERVER_H */
