diff --git a/src/nautilus-application-dbus-binding.h b/src/nautilus-application-dbus-binding.h
new file mode 100644
index 0000000..b339505
--- /dev/null
+++ b/src/nautilus-application-dbus-binding.h
@@ -0,0 +1,121 @@
+/* Generated by dbus-binding-tool; do not edit! */
+
+
+#ifndef __dbus_glib_marshal_nautilus_application_MARSHAL_H__
+#define __dbus_glib_marshal_nautilus_application_MARSHAL_H__
+
+#include	<glib-object.h>
+
+G_BEGIN_DECLS
+
+#ifdef G_ENABLE_DEBUG
+#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
+#define g_marshal_value_peek_char(v)     g_value_get_char (v)
+#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
+#define g_marshal_value_peek_int(v)      g_value_get_int (v)
+#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
+#define g_marshal_value_peek_long(v)     g_value_get_long (v)
+#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)
+#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)
+#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)
+#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
+#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
+#define g_marshal_value_peek_float(v)    g_value_get_float (v)
+#define g_marshal_value_peek_double(v)   g_value_get_double (v)
+#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)
+#define g_marshal_value_peek_param(v)    g_value_get_param (v)
+#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)
+#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)
+#define g_marshal_value_peek_object(v)   g_value_get_object (v)
+#else /* !G_ENABLE_DEBUG */
+/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
+ *          Do not access GValues directly in your code. Instead, use the
+ *          g_value_get_*() functions
+ */
+#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int
+#define g_marshal_value_peek_char(v)     (v)->data[0].v_int
+#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint
+#define g_marshal_value_peek_int(v)      (v)->data[0].v_int
+#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint
+#define g_marshal_value_peek_long(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64
+#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64
+#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_float(v)    (v)->data[0].v_float
+#define g_marshal_value_peek_double(v)   (v)->data[0].v_double
+#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer
+#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer
+#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer
+#endif /* !G_ENABLE_DEBUG */
+
+
+/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.EPEA1U:1) */
+extern void dbus_glib_marshal_nautilus_application_BOOLEAN__POINTER_POINTER (GClosure     *closure,
+                                                                             GValue       *return_value,
+                                                                             guint         n_param_values,
+                                                                             const GValue *param_values,
+                                                                             gpointer      invocation_hint,
+                                                                             gpointer      marshal_data);
+void
+dbus_glib_marshal_nautilus_application_BOOLEAN__POINTER_POINTER (GClosure     *closure,
+                                                                 GValue       *return_value G_GNUC_UNUSED,
+                                                                 guint         n_param_values,
+                                                                 const GValue *param_values,
+                                                                 gpointer      invocation_hint G_GNUC_UNUSED,
+                                                                 gpointer      marshal_data)
+{
+  typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER) (gpointer     data1,
+                                                             gpointer     arg_1,
+                                                             gpointer     arg_2,
+                                                             gpointer     data2);
+  register GMarshalFunc_BOOLEAN__POINTER_POINTER callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+  gboolean v_return;
+
+  g_return_if_fail (return_value != NULL);
+  g_return_if_fail (n_param_values == 3);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback);
+
+  v_return = callback (data1,
+                       g_marshal_value_peek_pointer (param_values + 1),
+                       g_marshal_value_peek_pointer (param_values + 2),
+                       data2);
+
+  g_value_set_boolean (return_value, v_return);
+}
+
+G_END_DECLS
+
+#endif /* __dbus_glib_marshal_nautilus_application_MARSHAL_H__ */
+
+#include <dbus/dbus-glib.h>
+static const DBusGMethodInfo dbus_glib_nautilus_application_methods[] = {
+  { (GCallback) nautilus_application_dbus_get_window_list, dbus_glib_marshal_nautilus_application_BOOLEAN__POINTER_POINTER, 0 },
+  { (GCallback) nautilus_application_dbus_create_navigation_window, dbus_glib_marshal_nautilus_application_BOOLEAN__POINTER_POINTER, 63 },
+};
+
+const DBusGObjectInfo dbus_glib_nautilus_application_object_info = {
+  0,
+  dbus_glib_nautilus_application_methods,
+  2,
+"org.gnome.NautilusApplication\0get_window_list\0S\0arg0\0O\0F\0N\0as\0\0org.gnome.NautilusApplication\0create_navigation_window\0S\0arg0\0O\0F\0N\0o\0\0\0",
+"\0",
+"\0"
+};
+
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
index fea09f6..386ca20 100644
--- a/src/nautilus-application.c
+++ b/src/nautilus-application.c
@@ -77,6 +77,9 @@
 #include <libnautilus-extension/nautilus-menu-provider.h>
 #include <libnautilus-private/nautilus-autorun.h>
 
+#include <dbus/dbus-glib.h>
+#include "nautilus-application-dbus-binding.h"
+
 enum
 {
   COMMAND_0, /* unused: 0 is an invalid command */
@@ -848,6 +851,34 @@ queue_accel_map_save_callback (GtkAccelMap *object, gchar *accel_path,
 	}
 }
 
+static void
+add_application_object_to_dbus(NautilusApplication *application)
+{
+	DBusGConnection *bus;
+	GError *error;
+	DBusGProxy *bus_proxy;
+	guint request_name_result;
+
+	error = NULL;
+
+	dbus_g_object_type_install_info(NAUTILUS_TYPE_APPLICATION, &dbus_glib_nautilus_application_object_info);
+	bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+
+	bus_proxy = dbus_g_proxy_new_for_name(bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
+
+	if (!dbus_g_proxy_call (bus_proxy, "RequestName", &error,
+			  G_TYPE_STRING, "org.gnome.Nautilus",
+			  G_TYPE_UINT, DBUS_NAME_FLAG_DO_NOT_QUEUE,
+			  G_TYPE_INVALID,
+			  G_TYPE_UINT, &request_name_result,
+			  G_TYPE_INVALID))
+	{
+		g_printerr ("Failed to acquire org.gnome.Nautilus: %s", error->message);
+	}
+
+	dbus_g_connection_register_g_object (bus, "/NautilusApplication", G_OBJECT (application));
+}
+
 void
 nautilus_application_startup (NautilusApplication *application,
 			      gboolean kill_shell,
@@ -859,6 +890,8 @@ nautilus_application_startup (NautilusApplication *application,
 {
 	UniqueMessageData *message;
 	
+
+
 	/* Check the user's ~/.nautilus directories and post warnings
 	 * if there are problems.
 	 */
@@ -873,8 +906,10 @@ nautilus_application_startup (NautilusApplication *application,
 			
 		}
 	} else {
+
 		char *accel_map_filename;
 
+
 		if (!no_desktop &&
 		    !eel_preferences_get_boolean (NAUTILUS_PREFERENCES_SHOW_DESKTOP)) {
 			no_desktop = TRUE;
@@ -890,6 +925,8 @@ nautilus_application_startup (NautilusApplication *application,
 		}
 
 		if (!unique_app_is_running (application->unique_app)) {
+			add_application_object_to_dbus(application);
+
 			finish_startup (application, no_desktop);
 			g_signal_connect (application->unique_app, "message-received", G_CALLBACK (message_received_cb), application);			
 		}
@@ -2056,3 +2093,37 @@ nautilus_application_class_init (NautilusApplicationClass *class)
         object_class = G_OBJECT_CLASS (class);
         object_class->finalize = nautilus_application_finalize;
 }
+
+gboolean
+nautilus_application_dbus_get_window_list (NautilusApplication *application, char ***ret, GError **error)
+{
+	  GList *cursor;
+	  int i;
+	  int n_windows;
+	  n_windows = g_list_length(nautilus_application_get_window_list());
+	  *ret = g_new(char*, n_windows+1);
+
+	  cursor = nautilus_application_get_window_list();
+	  i = 0;
+	  while((cursor != NULL) && (i<n_windows))
+	  {
+		  (*ret)[i] = g_strdup_printf("/NautilusWindow/%i", (guint)cursor->data);
+		  cursor = cursor->next;
+		  i++;
+	  }
+	  (*ret)[i] = NULL;
+	  return TRUE;
+}
+
+gboolean nautilus_application_dbus_create_navigation_window (NautilusApplication *application, char **ret, GError **error)
+{
+
+	NautilusWindow *window;
+	GFile *location;
+	window = nautilus_application_create_navigation_window (application, NULL, gdk_screen_get_default ());
+	location = g_file_new_for_uri("file:///");
+	nautilus_window_go_to(window, location);
+	*ret = g_strdup_printf("/NautilusWindow/%i", (guint)window);
+	return TRUE;
+}
+
diff --git a/src/nautilus-application.h b/src/nautilus-application.h
index 95c201e..5f914f4 100644
--- a/src/nautilus-application.h
+++ b/src/nautilus-application.h
@@ -111,5 +111,7 @@ void                 nautilus_application_open_desktop      (NautilusApplication
 void                 nautilus_application_close_desktop     (void);
 gboolean             nautilus_application_save_accel_map    (gpointer data);
 
+gboolean	     nautilus_application_dbus_get_window_list (NautilusApplication *application, char ***ret, GError **error);
+gboolean	     nautilus_application_dbus_create_navigation_window (NautilusApplication *application, char **ret, GError **error);
 
 #endif /* NAUTILUS_APPLICATION_H */
diff --git a/src/nautilus-application.xml b/src/nautilus-application.xml
new file mode 100644
index 0000000..1d3a232
--- /dev/null
+++ b/src/nautilus-application.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<node name="/">
+  <interface name="org.gnome.NautilusApplication">
+  
+    <method name="get_window_list">
+      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="nautilus_application_dbus_get_window_list"/>
+      <arg type="as" direction="out"/> 
+    </method>
+
+    <method name="create_navigation_window">
+      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="nautilus_application_dbus_create_navigation_window"/>
+      <arg type="o" direction="out"/> 
+    </method>
+
+  </interface>
+</node>
diff --git a/src/nautilus-window-dbus-binding.h b/src/nautilus-window-dbus-binding.h
new file mode 100644
index 0000000..a3a2bca
--- /dev/null
+++ b/src/nautilus-window-dbus-binding.h
@@ -0,0 +1,265 @@
+/* Generated by dbus-binding-tool; do not edit! */
+
+
+#ifndef __dbus_glib_marshal_nautilus_window_MARSHAL_H__
+#define __dbus_glib_marshal_nautilus_window_MARSHAL_H__
+
+#include	<glib-object.h>
+
+G_BEGIN_DECLS
+
+#ifdef G_ENABLE_DEBUG
+#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
+#define g_marshal_value_peek_char(v)     g_value_get_char (v)
+#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
+#define g_marshal_value_peek_int(v)      g_value_get_int (v)
+#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
+#define g_marshal_value_peek_long(v)     g_value_get_long (v)
+#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)
+#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)
+#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)
+#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
+#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
+#define g_marshal_value_peek_float(v)    g_value_get_float (v)
+#define g_marshal_value_peek_double(v)   g_value_get_double (v)
+#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)
+#define g_marshal_value_peek_param(v)    g_value_get_param (v)
+#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)
+#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)
+#define g_marshal_value_peek_object(v)   g_value_get_object (v)
+#else /* !G_ENABLE_DEBUG */
+/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
+ *          Do not access GValues directly in your code. Instead, use the
+ *          g_value_get_*() functions
+ */
+#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int
+#define g_marshal_value_peek_char(v)     (v)->data[0].v_int
+#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint
+#define g_marshal_value_peek_int(v)      (v)->data[0].v_int
+#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint
+#define g_marshal_value_peek_long(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64
+#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64
+#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_float(v)    (v)->data[0].v_float
+#define g_marshal_value_peek_double(v)   (v)->data[0].v_double
+#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer
+#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer
+#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer
+#endif /* !G_ENABLE_DEBUG */
+
+
+/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.XB460U:1) */
+extern void dbus_glib_marshal_nautilus_window_BOOLEAN__POINTER_POINTER (GClosure     *closure,
+                                                                        GValue       *return_value,
+                                                                        guint         n_param_values,
+                                                                        const GValue *param_values,
+                                                                        gpointer      invocation_hint,
+                                                                        gpointer      marshal_data);
+void
+dbus_glib_marshal_nautilus_window_BOOLEAN__POINTER_POINTER (GClosure     *closure,
+                                                            GValue       *return_value G_GNUC_UNUSED,
+                                                            guint         n_param_values,
+                                                            const GValue *param_values,
+                                                            gpointer      invocation_hint G_GNUC_UNUSED,
+                                                            gpointer      marshal_data)
+{
+  typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_POINTER) (gpointer     data1,
+                                                             gpointer     arg_1,
+                                                             gpointer     arg_2,
+                                                             gpointer     data2);
+  register GMarshalFunc_BOOLEAN__POINTER_POINTER callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+  gboolean v_return;
+
+  g_return_if_fail (return_value != NULL);
+  g_return_if_fail (n_param_values == 3);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_BOOLEAN__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback);
+
+  v_return = callback (data1,
+                       g_marshal_value_peek_pointer (param_values + 1),
+                       g_marshal_value_peek_pointer (param_values + 2),
+                       data2);
+
+  g_value_set_boolean (return_value, v_return);
+}
+
+/* BOOLEAN:STRING,BOXED,POINTER (/tmp/dbus-binding-tool-c-marshallers.XB460U:2) */
+extern void dbus_glib_marshal_nautilus_window_BOOLEAN__STRING_BOXED_POINTER (GClosure     *closure,
+                                                                             GValue       *return_value,
+                                                                             guint         n_param_values,
+                                                                             const GValue *param_values,
+                                                                             gpointer      invocation_hint,
+                                                                             gpointer      marshal_data);
+void
+dbus_glib_marshal_nautilus_window_BOOLEAN__STRING_BOXED_POINTER (GClosure     *closure,
+                                                                 GValue       *return_value G_GNUC_UNUSED,
+                                                                 guint         n_param_values,
+                                                                 const GValue *param_values,
+                                                                 gpointer      invocation_hint G_GNUC_UNUSED,
+                                                                 gpointer      marshal_data)
+{
+  typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER) (gpointer     data1,
+                                                                  gpointer     arg_1,
+                                                                  gpointer     arg_2,
+                                                                  gpointer     arg_3,
+                                                                  gpointer     data2);
+  register GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+  gboolean v_return;
+
+  g_return_if_fail (return_value != NULL);
+  g_return_if_fail (n_param_values == 4);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_BOOLEAN__STRING_BOXED_POINTER) (marshal_data ? marshal_data : cc->callback);
+
+  v_return = callback (data1,
+                       g_marshal_value_peek_string (param_values + 1),
+                       g_marshal_value_peek_boxed (param_values + 2),
+                       g_marshal_value_peek_pointer (param_values + 3),
+                       data2);
+
+  g_value_set_boolean (return_value, v_return);
+}
+
+/* BOOLEAN:STRING,POINTER (/tmp/dbus-binding-tool-c-marshallers.XB460U:3) */
+extern void dbus_glib_marshal_nautilus_window_BOOLEAN__STRING_POINTER (GClosure     *closure,
+                                                                       GValue       *return_value,
+                                                                       guint         n_param_values,
+                                                                       const GValue *param_values,
+                                                                       gpointer      invocation_hint,
+                                                                       gpointer      marshal_data);
+void
+dbus_glib_marshal_nautilus_window_BOOLEAN__STRING_POINTER (GClosure     *closure,
+                                                           GValue       *return_value G_GNUC_UNUSED,
+                                                           guint         n_param_values,
+                                                           const GValue *param_values,
+                                                           gpointer      invocation_hint G_GNUC_UNUSED,
+                                                           gpointer      marshal_data)
+{
+  typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_POINTER) (gpointer     data1,
+                                                            gpointer     arg_1,
+                                                            gpointer     arg_2,
+                                                            gpointer     data2);
+  register GMarshalFunc_BOOLEAN__STRING_POINTER callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+  gboolean v_return;
+
+  g_return_if_fail (return_value != NULL);
+  g_return_if_fail (n_param_values == 3);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_BOOLEAN__STRING_POINTER) (marshal_data ? marshal_data : cc->callback);
+
+  v_return = callback (data1,
+                       g_marshal_value_peek_string (param_values + 1),
+                       g_marshal_value_peek_pointer (param_values + 2),
+                       data2);
+
+  g_value_set_boolean (return_value, v_return);
+}
+
+/* BOOLEAN:POINTER (/tmp/dbus-binding-tool-c-marshallers.XB460U:4) */
+extern void dbus_glib_marshal_nautilus_window_BOOLEAN__POINTER (GClosure     *closure,
+                                                                GValue       *return_value,
+                                                                guint         n_param_values,
+                                                                const GValue *param_values,
+                                                                gpointer      invocation_hint,
+                                                                gpointer      marshal_data);
+void
+dbus_glib_marshal_nautilus_window_BOOLEAN__POINTER (GClosure     *closure,
+                                                    GValue       *return_value G_GNUC_UNUSED,
+                                                    guint         n_param_values,
+                                                    const GValue *param_values,
+                                                    gpointer      invocation_hint G_GNUC_UNUSED,
+                                                    gpointer      marshal_data)
+{
+  typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER) (gpointer     data1,
+                                                     gpointer     arg_1,
+                                                     gpointer     data2);
+  register GMarshalFunc_BOOLEAN__POINTER callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+  gboolean v_return;
+
+  g_return_if_fail (return_value != NULL);
+  g_return_if_fail (n_param_values == 2);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_BOOLEAN__POINTER) (marshal_data ? marshal_data : cc->callback);
+
+  v_return = callback (data1,
+                       g_marshal_value_peek_pointer (param_values + 1),
+                       data2);
+
+  g_value_set_boolean (return_value, v_return);
+}
+
+G_END_DECLS
+
+#endif /* __dbus_glib_marshal_nautilus_window_MARSHAL_H__ */
+
+#include <dbus/dbus-glib.h>
+static const DBusGMethodInfo dbus_glib_nautilus_window_methods[] = {
+  { (GCallback) nautilus_window_dbus_go_to, dbus_glib_marshal_nautilus_window_BOOLEAN__STRING_POINTER, 0 },
+  { (GCallback) nautilus_window_dbus_go_up, dbus_glib_marshal_nautilus_window_BOOLEAN__POINTER, 43 },
+  { (GCallback) nautilus_window_dbus_get_location_uri, dbus_glib_marshal_nautilus_window_BOOLEAN__POINTER_POINTER, 77 },
+  { (GCallback) nautilus_window_dbus_go_to_with_selection, dbus_glib_marshal_nautilus_window_BOOLEAN__STRING_BOXED_POINTER, 135 },
+  { (GCallback) nautilus_window_dbus_close, dbus_glib_marshal_nautilus_window_BOOLEAN__POINTER, 203 },
+};
+
+const DBusGObjectInfo dbus_glib_nautilus_window_object_info = {
+  0,
+  dbus_glib_nautilus_window_methods,
+  5,
+"org.gnome.NautilusWindow\0go_to\0S\0arg0\0I\0s\0\0org.gnome.NautilusWindow\0go_up\0S\0\0org.gnome.NautilusWindow\0get_location_uri\0S\0arg0\0O\0F\0N\0s\0\0org.gnome.NautilusWindow\0go_to_with_selection\0S\0arg0\0I\0s\0arg1\0I\0as\0\0org.gnome.NautilusWindow\0close\0S\0\0\0",
+"\0",
+"\0"
+};
+
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 10bcb24..24596c8 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -74,6 +74,8 @@
  */
 #include "nautilus-desktop-window.h"
 
+#include "nautilus-window-dbus-binding.h"
+
 #define MAX_HISTORY_ITEMS 50
 
 #define EXTRA_VIEW_WIDGETS_BACKGROUND "#a7c6e1"
@@ -145,6 +147,10 @@ nautilus_window_init (NautilusWindow *window)
 	GtkWidget *menu;
 	GtkWidget *statusbar;
 
+	gchar *dbus_window_as_string;
+	DBusGConnection *bus;
+	GError *error = NULL;
+
 	window->details = G_TYPE_INSTANCE_GET_PRIVATE (window, NAUTILUS_TYPE_WINDOW, NautilusWindowDetails);
 
 	window->details->show_hidden_files_mode = NAUTILUS_WINDOW_SHOW_HIDDEN_FILES_DEFAULT;
@@ -189,6 +195,11 @@ nautilus_window_init (NautilusWindow *window)
 
 	/* Keep the main event loop alive as long as the window exists */
 	nautilus_main_event_loop_register (GTK_OBJECT (window));
+
+	bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+	dbus_g_object_type_install_info(NAUTILUS_TYPE_WINDOW, &dbus_glib_nautilus_window_object_info);
+	dbus_window_as_string = g_strdup_printf("/NautilusWindow/%i", (guint)window);
+	dbus_g_connection_register_g_object (bus, dbus_window_as_string, G_OBJECT (window));
 }
 
 /* Unconditionally synchronize the GtkUIManager of WINDOW. */
@@ -1903,3 +1914,41 @@ nautilus_window_has_menubar_and_statusbar (NautilusWindow *window)
 {
 	return (nautilus_window_get_window_type (window) != NAUTILUS_WINDOW_DESKTOP);
 }
+
+gboolean
+nautilus_window_dbus_go_to (NautilusWindow *window, const char *location, GError **error)
+{
+	GFile *file_location;
+	file_location = g_file_new_for_uri(location);
+	nautilus_window_go_to(window, file_location);
+	return TRUE;
+}
+
+gboolean nautilus_window_dbus_go_up (NautilusWindow    *window,
+						       GError **error)
+{
+	nautilus_window_go_up(window, FALSE, FALSE);
+	return TRUE;
+}
+gboolean nautilus_window_dbus_get_location_uri (NautilusWindow    *window,
+						       char             **location,
+						       GError **error)
+{
+	*location = g_strdup(nautilus_window_slot_get_location_uri(window->details->active_slot));
+	return TRUE;
+}
+
+gboolean nautilus_window_dbus_go_to_with_selection (NautilusWindow    *window,
+						       const char             *location_uri,
+						       const char** selection_uris,
+						       GError **error)
+{
+//	nautilus_window_slot_go_to_with_selection(window->details->active_slot, location, selection);
+	return TRUE;
+}
+
+gboolean nautilus_window_dbus_close (NautilusWindow *window, GError **error)
+{
+	nautilus_window_close(window);
+	return TRUE;
+}
diff --git a/src/nautilus-window.h b/src/nautilus-window.h
index 2c5e27e..026e245 100644
--- a/src/nautilus-window.h
+++ b/src/nautilus-window.h
@@ -162,4 +162,18 @@ void             nautilus_window_allow_burn_cd        (NautilusWindow    *window
 GtkUIManager *   nautilus_window_get_ui_manager       (NautilusWindow    *window);
 gboolean         nautilus_window_has_menubar_and_statusbar (NautilusWindow *window);
 
+gboolean         nautilus_window_dbus_go_to           (NautilusWindow    *window,
+						       const char             *location,
+						       GError **error);
+gboolean         nautilus_window_dbus_go_up           (NautilusWindow    *window,
+						       GError **error);
+gboolean         nautilus_window_dbus_get_location_uri  (NautilusWindow    *window,
+						       char             **location,
+						       GError **error);
+gboolean         nautilus_window_dbus_go_to_with_selection (NautilusWindow    *window,
+						       const char             *location_uri,
+						       const char** selection_uris,
+						       GError **error);
+gboolean         nautilus_window_dbus_close           (NautilusWindow    *window,
+						       GError **error);
 #endif
diff --git a/src/nautilus-window.xml b/src/nautilus-window.xml
new file mode 100644
index 0000000..129a9cc
--- /dev/null
+++ b/src/nautilus-window.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<node name="/">
+  <interface name="org.gnome.NautilusWindow">
+
+    <method name="go_to">
+      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="nautilus_window_dbus_go_to"/>
+      <arg type="s"/>
+    </method>
+
+    <method name="go_up">
+      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="nautilus_window_dbus_go_up"/>
+    </method>
+
+    <method name="get_location_uri">
+      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="nautilus_window_dbus_get_location_uri"/>
+      <arg type="s" direction="out"/>
+    </method>
+
+    <method name="go_to_with_selection">
+      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="nautilus_window_dbus_go_to_with_selection"/>
+      <arg type="s"/>
+      <arg type="as"/>
+    </method>
+
+    <method name="close">
+      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="nautilus_window_dbus_close"/>
+    </method>
+
+  </interface>
+</node>
