diff --git a/data/Makefile.am b/data/Makefile.am
index e2df2c1..0604f96 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -54,6 +54,7 @@ EXTRA_DIST = $(nautilusdata_DATA) 	\
 	dbus-interfaces.xml		\
 	freedesktop-dbus-interfaces.xml	\
 	shell-search-provider-dbus-interfaces.xml \
+	preview-dbus-interfaces.xml \
 	$(xml_in_files) 		\
 	$(desktop_in_files)		\
 	$(service_in_files)		\
diff --git a/data/dbus-interfaces.xml b/data/dbus-interfaces.xml
index 85e08c6..7c35ce1 100644
--- a/data/dbus-interfaces.xml
+++ b/data/dbus-interfaces.xml
@@ -1,6 +1,6 @@
 <!DOCTYPE node PUBLIC
-"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
-"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
 
 <!--
  Copyright (C) 2011 Red Hat, Inc.
@@ -23,14 +23,14 @@
  Author: Alexander Larsson <alexl@redhat.com>
 -->
 
-<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+<node name='/' xmlns:doc='http://www.freedesktop.org/dbus/1.0/doc.dtd'>
   <interface name='org.gnome.Nautilus.FileOperations'>
     <method name='CopyURIs'>
       <arg type='as' name='SourceFilesURIList' direction='in'/>
       <arg type='s' name='DestinationDirectoryURI' direction='in'/>
     </method>
     <method name='EmptyTrash'>
-    </method>"
+    </method>'
     <method name='CopyFile'>
       <arg type='s' name='SourceFileURI' direction='in'/>
       <arg type='s' name='SourceDisplayName' direction='in'/>
@@ -38,4 +38,11 @@
       <arg type='s' name='DestinationDisplayName' direction='in'/>
     </method>
   </interface>
+  <interface name='org.gnome.Nautilus.Preview'>
+    <method name='SelectAdjacentFile'>
+      <arg type='n' name='direction' direction='in' />
+    </method>
+    <method name='ClosePreview'>
+    </method>
+  </interface>
 </node>
diff --git a/libnautilus-private/nautilus-canvas-container.c b/libnautilus-private/nautilus-canvas-container.c
index 91efe47..822a909 100644
--- a/libnautilus-private/nautilus-canvas-container.c
+++ b/libnautilus-private/nautilus-canvas-container.c
@@ -260,6 +260,14 @@ typedef struct {
 	gboolean tight;
 } PlacementGrid;
 
+typedef enum {
+	MOVE_UP,
+	MOVE_DOWN,
+	MOVE_LEFT,
+	MOVE_RIGHT,
+	DELETE,
+	ENTER } previewer_actions;
+
 static guint signals[LAST_SIGNAL];
 
 /* Functions dealing with NautilusIcons.  */
@@ -3514,6 +3522,7 @@ keyboard_right (NautilusCanvasContainer *container,
 			    closest_in_90_degrees);
 }
 
+
 static void
 keyboard_left (NautilusCanvasContainer *container,
 	       GdkEventKey *event)
@@ -3623,6 +3632,7 @@ keyboard_up (NautilusCanvasContainer *container,
 			    closest_in_90_degrees);
 }
 
+
 static void
 keyboard_space (NautilusCanvasContainer *container,
 		GdkEventKey *event)
@@ -5822,10 +5832,33 @@ preview_selected_items (NautilusCanvasContainer *container)
 			       signals[ACTIVATE_PREVIEWER], 0,
 			       selection, locations);
 	}
-	g_list_free (selection);	
+	g_list_free (selection);
 	g_array_unref (locations);
 }
 
+void nautilus_canvas_container_preview_action(NautilusCanvasContainer *container, 
+	const gint action) {
+  GdkEventKey * event;
+  event = (GdkEventKey*) gdk_event_new (GDK_KEY_PRESS);
+  switch(action) {
+    case MOVE_LEFT:
+      keyboard_left(container, event);
+      break;
+    case MOVE_RIGHT:
+      keyboard_right(container, event);
+      break;
+    case MOVE_UP:
+      keyboard_up(container, event);
+      break;
+    case MOVE_DOWN:
+      keyboard_down(container, event);
+      break;
+    default:
+      break;
+  }
+  preview_selected_items (container);
+}
+
 static void
 activate_selected_items_alternate (NautilusCanvasContainer *container,
 				   NautilusCanvasIcon *icon)
diff --git a/libnautilus-private/nautilus-canvas-container.h b/libnautilus-private/nautilus-canvas-container.h
index ff534a7..b0a45bc 100644
--- a/libnautilus-private/nautilus-canvas-container.h
+++ b/libnautilus-private/nautilus-canvas-container.h
@@ -342,6 +342,8 @@ void              nautilus_canvas_container_set_store_layout_timestamps   (Nauti
 void              nautilus_canvas_container_widget_to_file_operation_position (NautilusCanvasContainer *container,
 									       GdkPoint              *position);
 
+void nautilus_canvas_container_preview_action(NautilusCanvasContainer *container, const gint action);
+
 #define CANVAS_WIDTH(container,allocation) ((allocation.width		\
 					     - container->details->left_margin \
 					     - container->details->right_margin) \
diff --git a/libnautilus-private/nautilus-dbus-manager.c b/libnautilus-private/nautilus-dbus-manager.c
index 0d90c18..b198279 100644
--- a/libnautilus-private/nautilus-dbus-manager.c
+++ b/libnautilus-private/nautilus-dbus-manager.c
@@ -22,11 +22,14 @@
  */
 
 #include <config.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
 
 #include "nautilus-dbus-manager.h"
 #include "nautilus-generated.h"
 
 #include "nautilus-file-operations.h"
+#include "nautilus-canvas-private.h"
 
 #define DEBUG_FLAG NAUTILUS_DEBUG_DBUS
 #include "nautilus-debug.h"
@@ -38,6 +41,7 @@ struct _NautilusDBusManager {
 
   GDBusObjectManagerServer *object_manager;
   NautilusDBusFileOperations *file_operations;
+  // NautilusDBusPreviewOperations *preview_operations;
 };
 
 struct _NautilusDBusManagerClass {
@@ -62,6 +66,11 @@ nautilus_dbus_manager_dispose (GObject *object)
     self->object_manager = NULL;
   }
 
+  // if (self->preview_operations) {
+  //   g_object_unref (self->preview_operations);
+  //   self->preview_operations = NULL;
+  // }
+
   G_OBJECT_CLASS (nautilus_dbus_manager_parent_class)->dispose (object);
 }
 
@@ -130,7 +139,34 @@ handle_empty_trash (NautilusDBusFileOperations *object,
 
   nautilus_dbus_file_operations_complete_empty_trash (object, invocation);
   return TRUE; /* invocation was handled */
-}
+} 
+
+// static gboolean
+// handle_select_adjacent_file(NautilusDBusPreviewOperations *object, 
+//     GDBusMethodInvocation *invocation,
+//     const guint xid,
+//     const gint direction)
+// {
+//   g_print("Direction: %d, XID: %d", direction, xid);
+//   // gtk_application_get_window_by_id(xid);
+//   // GdkEventKey * event = (GdkEventKey*)event;
+//   GdkWindow * window = gdk_x11_window_lookup_for_display(gdk_display_get_default(), xid);
+
+//   g_print("Window: %d", window);
+//   // event->window = window;
+//   // event->send_event = TRUE;
+//   // event->time = GDK_CURRENT_TIME;
+//   // event->type = GDK_KEY_PRESS;
+//   // event->string = NULL;
+//   // event->state = 0;  
+//   // event->hardware_keycode = GDK_KEY_rightarrow;
+//   // gdk_display_put_event(window, event);
+//   // nautilus_keyboard_right(
+//   //   Window,
+//   //   Event
+//   // );
+//   return direction; // invocation was handled
+// }
 
 static void
 nautilus_dbus_manager_init (NautilusDBusManager *self)
@@ -141,11 +177,13 @@ nautilus_dbus_manager_init (NautilusDBusManager *self)
 
   self->object_manager = g_dbus_object_manager_server_new ("/org/gnome/Nautilus");
   self->file_operations = nautilus_dbus_file_operations_skeleton_new ();
+  // self->preview_operations = nautilus_dbus_preview_operations_skeleton_new ();
 
   g_signal_connect (self->file_operations,
 		    "handle-copy-uris",
 		    G_CALLBACK (handle_copy_uris),
 		    self);
+
   g_signal_connect (self->file_operations,
 		    "handle-copy-file",
 		    G_CALLBACK (handle_copy_file),
@@ -155,9 +193,17 @@ nautilus_dbus_manager_init (NautilusDBusManager *self)
 		    G_CALLBACK (handle_empty_trash),
 		    self);
 
+  // g_signal_connect (self->preview_operations,
+		//     "handle-move-selection",
+		//     G_CALLBACK (handle_select_adjacent_file),
+		//     self);
+
   g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->file_operations), connection,
 				    "/org/gnome/Nautilus", NULL);
 
+  // g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->preview_operations), connection,
+		// 		    "/org/gnome/Nautilus", NULL);
+
   g_dbus_object_manager_server_set_connection (self->object_manager, connection);
 }
 
diff --git a/src/nautilus-previewer.c b/src/nautilus-previewer.c
index 134b366..d9e3ef6 100644
--- a/src/nautilus-previewer.c
+++ b/src/nautilus-previewer.c
@@ -24,6 +24,9 @@
 #include "config.h"
 
 #include "nautilus-previewer.h"
+#include "nautilus-view.h"
+
+#include "nautilus-canvas-container.h"
 
 #define DEBUG_FLAG NAUTILUS_DEBUG_PREVIEWER
 #include <libnautilus-private/nautilus-debug.h>
@@ -38,8 +41,10 @@ G_DEFINE_TYPE (NautilusPreviewer, nautilus_previewer, G_TYPE_OBJECT);
 
 static NautilusPreviewer *singleton = NULL;
 
+
 struct _NautilusPreviewerPriv {
   GDBusConnection *connection;
+  NautilusCanvasContainer *current_canvas;
 };
 
 static void
@@ -64,8 +69,7 @@ nautilus_previewer_constructor (GType type,
   if (singleton != NULL)
     return G_OBJECT (singleton);
 
-  retval = G_OBJECT_CLASS (nautilus_previewer_parent_class)->constructor
-    (type, n_construct_params, construct_params);
+  retval = G_OBJECT_CLASS (nautilus_previewer_parent_class)->constructor(type, n_construct_params, construct_params);
 
   singleton = NAUTILUS_PREVIEWER (retval);
   g_object_add_weak_pointer (retval, (gpointer) &singleton);
@@ -74,6 +78,20 @@ nautilus_previewer_constructor (GType type,
 }
 
 static void
+nautilus_previewer_handle_next (GDBusConnection  *connection,
+                                      const gchar      *sender_name,
+                                      const gchar      *object_path,
+                                      const gchar      *interface_name,
+                                      const gchar      *signal_name,
+                                      GVariant         *parameters,
+                                      gpointer         user_data) {
+  gint action_type;
+  NautilusPreviewer *self = user_data;
+  g_variant_get(parameters, "(n)", &action_type);
+  nautilus_canvas_container_preview_action(self->priv->current_canvas, action_type);
+}
+
+static void
 nautilus_previewer_init (NautilusPreviewer *self)
 {
   GError *error = NULL;
@@ -89,6 +107,21 @@ nautilus_previewer_init (NautilusPreviewer *self)
     g_error_free (error);
     return;
   }
+  else
+  {
+    g_dbus_connection_signal_subscribe (
+      self->priv->connection,
+      NULL,
+      PREVIEWER_DBUS_IFACE,
+      "TriggerNautilus",
+      PREVIEWER_DBUS_PATH,
+      NULL,
+      G_DBUS_SIGNAL_FLAGS_NONE,
+      nautilus_previewer_handle_next,
+      g_object_ref (self),
+      NULL
+    );
+  }
 }
 
 static void
@@ -111,6 +144,7 @@ previewer_show_file_ready_cb (GObject *source,
   NautilusPreviewer *self = user_data;
   GError *error = NULL;
 
+
   g_dbus_connection_call_finish (self->priv->connection,
                                  res, &error);
 
@@ -150,6 +184,14 @@ nautilus_previewer_get_singleton (void)
 }
 
 void
+nautilus_previewer_set_current_container (NautilusPreviewer *self,
+  NautilusView * view)
+{
+  self->priv->current_canvas = nautilus_canvas_view_get_canvas_container(view);
+}
+
+
+void
 nautilus_previewer_call_show_file (NautilusPreviewer *self,
                                    const gchar *uri,
                                    guint xid,
diff --git a/src/nautilus-previewer.h b/src/nautilus-previewer.h
index 8f10c22..48399fe 100644
--- a/src/nautilus-previewer.h
+++ b/src/nautilus-previewer.h
@@ -62,6 +62,7 @@ void nautilus_previewer_call_show_file (NautilusPreviewer *previewer,
 					gboolean close_if_already_visible);
 void nautilus_previewer_call_close (NautilusPreviewer *previewer);
 
+
 G_END_DECLS
 
 #endif /* __NAUTILUS_PREVIEWER_H__ */
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 481d039..794feff 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -38,6 +38,9 @@
 #include "nautilus-mime-actions.h"
 #include "nautilus-previewer.h"
 #include "nautilus-properties-window.h"
+#include "nautilus-canvas-view.h"
+#include "nautilus-canvas-container.h"
+#include "nautilus-generated.h"
 
 #if ENABLE_EMPTY_VIEW
 #include "nautilus-empty-view.h"
@@ -1048,6 +1051,8 @@ nautilus_view_preview_files (NautilusView *view,
 	uri = nautilus_file_get_uri (files->data);
 	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (view));
 
+	nautilus_previewer_set_current_container(previewer, view);
+
 	xid = gdk_x11_window_get_xid (gtk_widget_get_window (toplevel));
 	nautilus_previewer_call_show_file (previewer, uri, xid, TRUE);
 
