diff --git a/shell/ev-application.c b/shell/ev-application.c
index 49ffe0c..3a97bf6 100644
--- a/shell/ev-application.c
+++ b/shell/ev-application.c
@@ -751,49 +751,70 @@ method_call_cb (GDBusConnection       *connection,
 	const gchar     *search_string = NULL;
 	GdkScreen       *screen = NULL;
 
-        if (g_strcmp0 (method_name, "Reload") != 0)
-                return;
+	if (g_strcmp0 (interface_name, APPLICATION_DBUS_INTERFACE) != 0)
+		return;
 
-        g_variant_get (parameters, "(a{sv}u)", &iter, &timestamp);
-
-        while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) {
-                if (strcmp (key, "display") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
-                        display = ev_display_open_if_needed (g_variant_get_string (value, NULL));
-                } else if (strcmp (key, "screen") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
-                        screen_number = g_variant_get_int32 (value);
-                } else if (strcmp (key, "mode") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
-                        mode = g_variant_get_uint32 (value);
-                } else if (strcmp (key, "page-label") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
-                        dest = ev_link_dest_new_page_label (g_variant_get_string (value, NULL));
-                } else if (strcmp (key, "find-string") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
-                        search_string = g_variant_get_string (value, NULL);
-                }
-        }
-        g_variant_iter_free (iter);
-
-        if (display != NULL &&
-            screen_number >= 0 &&
-            screen_number < gdk_display_get_n_screens (display))
-                screen = gdk_display_get_screen (display, screen_number);
-        else
-                screen = gdk_screen_get_default ();
-
-	windows = ev_application_get_windows (application);
-	for (l = windows; l != NULL; l = g_list_next (l)) {
-		EvWindow *ev_window = EV_WINDOW (l->data);
-
-		ev_application_open_uri_in_window (application, application->uri,
-						   ev_window,
-						   screen, dest, mode,
-						   search_string,
-						   timestamp);
-	}
-	g_list_free (windows);
 
-	if (dest)
-		g_object_unref (dest);
+	if (g_strcmp0 (method_name, "Reload") == 0) {
+
+		g_variant_get (parameters, "(a{sv}u)", &iter, &timestamp);
+
+		while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) {
+			if (strcmp (key, "display") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+				display = ev_display_open_if_needed (g_variant_get_string (value, NULL));
+			} else if (strcmp (key, "screen") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+				screen_number = g_variant_get_int32 (value);
+			} else if (strcmp (key, "mode") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
+			mode = g_variant_get_uint32 (value);
+			} else if (strcmp (key, "page-label") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+				dest = ev_link_dest_new_page_label (g_variant_get_string (value, NULL));
+			} else if (strcmp (key, "find-string") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+				search_string = g_variant_get_string (value, NULL);
+			}
+		}
+		g_variant_iter_free (iter);
+
+		if (display != NULL &&
+		    screen_number >= 0 &&
+		    screen_number < gdk_display_get_n_screens (display))
+			screen = gdk_display_get_screen (display, screen_number);
+		else
+			screen = gdk_screen_get_default ();
+
+		windows = ev_application_get_windows (application);
+		for (l = windows; l != NULL; l = g_list_next (l)) {
+			EvWindow *ev_window = EV_WINDOW (l->data);
 
-	g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
+			ev_application_open_uri_in_window (application, application->uri,
+							   ev_window,
+							   screen, dest, mode,
+							   search_string,
+							   timestamp);
+		}
+		g_list_free (windows);
+
+		if (dest)
+			g_object_unref (dest);
+
+		g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
+	} else if (g_strcmp0 (method_name, "GetWindowList") == 0) {
+		GList   *windows = ev_application_get_windows (application);
+		GVariantBuilder *builder;
+		GList	*list_iter;
+
+		builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
+		list_iter = windows;
+
+		while (list_iter != NULL) {
+			const gchar *path = ev_window_get_dbus_object_path (EV_WINDOW (list_iter->data));
+
+			g_variant_builder_add (builder, "s", path);
+			list_iter = g_list_next (list_iter);
+		}
+
+		g_list_free (windows);
+		g_dbus_method_invocation_return_value (invocation, g_variant_new ("(as)", builder));
+	} 
 }
 
 static const char introspection_xml[] =
@@ -803,6 +824,9 @@ static const char introspection_xml[] =
               "<arg type='a{sv}' name='args' direction='in'/>"
               "<arg type='u' name='timestamp' direction='in'/>"
             "</method>"
+            "<method name='GetWindowList'>"
+              "<arg type='as' name='window_list' direction='out'/>"
+            "</method>"
           "</interface>"
         "</node>";
 
diff --git a/shell/ev-daemon.c b/shell/ev-daemon.c
index b136369..e140a12 100644
--- a/shell/ev-daemon.c
+++ b/shell/ev-daemon.c
@@ -317,7 +317,28 @@ method_call_cb (GDBusConnection       *connection,
                 ev_daemon_maybe_start_killtimer (user_data);
 
                 g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
-        }
+	
+	} else if (g_strcmp0 (method_name, "FindDocument") == 0) {
+		EvDoc *doc;
+		const gchar *uri;
+
+		g_variant_get (parameters, "(&s)",  &uri);
+
+		LOG ("FindDocument '%s' \n", uri);
+
+		doc = ev_daemon_find_doc (uri);
+		if (doc == NULL) {
+			LOG ("GetViewerForUri URI was not registered!\n");
+			g_dbus_method_invocation_return_error_literal (invocation,
+								       G_DBUS_ERROR,
+								       G_DBUS_ERROR_INVALID_ARGS,
+								       "URI not registered");
+			return;
+		}
+
+		g_dbus_method_invocation_return_value (invocation, g_variant_new (doc->dbus_name));
+
+	}
 }
 
 static const char introspection_xml[] =
@@ -330,6 +351,10 @@ static const char introspection_xml[] =
       "<method name='UnregisterDocument'>"
         "<arg type='s' name='uri' direction='in'/>"
       "</method>"
+      "<method name='FindDocument'>"
+        "<arg type='s' name='uri' direction='in'/>"
+        "<arg type='s' name='owner' direction='out'/>"
+      "</method>"
     "</interface>"
   "</node>";
 
diff --git a/shell/ev-window.c b/shell/ev-window.c
index fa7a16b..75a4634 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -337,6 +337,7 @@ static void     ev_window_media_player_key_pressed      (EvWindow         *windo
 							 const gchar      *key,
 							 gpointer          user_data);
 static void     ev_window_update_max_min_scale          (EvWindow         *window);
+static void	ev_window_on_close			(EvWindow         *window);
 
 static guint ev_window_n_copies = 0;
 
@@ -4866,6 +4867,7 @@ ev_window_dispose (GObject *object)
 
 #ifdef ENABLE_DBUS
 	if (priv->dbus_object_id > 0) {
+		ev_window_on_close (window);
 		g_dbus_connection_unregister_object (ev_application_get_dbus_connection (EV_APP),
 						     priv->dbus_object_id);
 		priv->dbus_object_id = 0;
@@ -6227,6 +6229,33 @@ ev_window_sync_source (EvWindow     *window,
 }
 
 static void
+ev_window_on_close (EvWindow *window)
+{
+	GDBusConnection *connection;
+	GError          *error = NULL;
+
+	if (window->priv->dbus_object_id <= 0)
+		return;
+
+	connection = ev_application_get_dbus_connection (EV_APP);
+	if (!connection)
+		return;
+
+	g_dbus_connection_emit_signal (connection,
+				       NULL,
+				       window->priv->dbus_object_path,
+				       EV_WINDOW_DBUS_INTERFACE,
+				       "Closed",
+				       NULL, 
+				       &error);
+	if (error) {
+		g_printerr ("Failed to emit DBus signal Closed: %s\n",
+			    error->message);
+		g_error_free (error);
+	}
+}
+
+static void
 method_call_cb (GDBusConnection       *connection,
                 const gchar           *sender,
                 const gchar           *object_path,
@@ -6263,6 +6292,8 @@ static const char introspection_xml[] =
 	      "<arg type='s' name='source_file' direction='out'/>"
 	      "<arg type='(ii)' name='source_point' direction='out'/>"
 	    "</signal>"
+            "<signal name='Closed'>"
+            "</signal>"
           "</interface>"
         "</node>";
 
@@ -6692,3 +6723,12 @@ ev_window_new (void)
 	return ev_window;
 }
 
+const gchar *
+ev_window_get_dbus_object_path (EvWindow *ev_window)
+{
+#ifdef ENABLE_DBUS
+	return ev_window->priv->dbus_object_path;
+#else
+	return NULL;
+#endif
+}
diff --git a/shell/ev-window.h b/shell/ev-window.h
index 09055da..1173390 100644
--- a/shell/ev-window.h
+++ b/shell/ev-window.h
@@ -85,6 +85,8 @@ gboolean	ev_window_is_empty	(const EvWindow *ev_window);
 void		ev_window_print_range   (EvWindow       *ev_window,
 					 int             first_page,
 					 int		 last_page);
+const gchar *	ev_window_get_dbus_object_path (EvWindow *ev_window);
+
 
 G_END_DECLS
 
