diff --git a/shell/ev-gdbus.xml b/shell/ev-gdbus.xml
index b6b50d1..912e480 100644
--- a/shell/ev-gdbus.xml
+++ b/shell/ev-gdbus.xml
@@ -19,6 +19,9 @@
       <arg type='(ii)' name='source_point' direction='in'/>
       <arg type='u' name='timestamp' direction='in'/>
     </method>
+    <method name='Navigate'>
+      <arg type='s' name='directive' direction='in'/>
+    </method>
     <signal name='SyncSource'>
       <arg type='s' name='source_file' direction='out'/>
       <arg type='(ii)' name='source_point' direction='out'/>
diff --git a/shell/ev-window.c b/shell/ev-window.c
index a11fe50..2af53bb 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -7250,6 +7250,28 @@ handle_sync_view_cb (EvEvinceWindow        *object,
 
 	return TRUE;
 }
+
+static gboolean
+handle_navigate_cb (EvEvinceWindow        *object,
+		     GDBusMethodInvocation *invocation,
+		     const gchar           *directive,
+		     EvWindow              *window)
+{
+	if (strcmp (directive, "Previous") == 0) {
+		if (EV_WINDOW_IS_PRESENTATION (window))
+			ev_view_presentation_previous_page (EV_VIEW_PRESENTATION (window->priv->presentation_view));
+		else
+			ev_window_cmd_go_previous_page (NULL, window);
+	} else if (strcmp (directive, "Next") == 0) {
+		if (EV_WINDOW_IS_PRESENTATION (window))
+			ev_view_presentation_next_page (EV_VIEW_PRESENTATION (window->priv->presentation_view));
+		else
+			ev_window_cmd_go_next_page (NULL, window);
+	}
+
+	ev_evince_window_complete_navigate (object, invocation);
+	return TRUE;
+}
 #endif /* ENABLE_DBUS */
 
 static gboolean
@@ -7312,6 +7334,9 @@ ev_window_init (EvWindow *ev_window)
 			g_signal_connect (skeleton, "handle-sync-view",
 					  G_CALLBACK (handle_sync_view_cb),
 					  ev_window);
+			g_signal_connect (skeleton, "handle-navigate",
+					  G_CALLBACK (handle_navigate_cb),
+					  ev_window);
                 } else {
                         g_printerr ("Failed to register bus object %s: %s\n",
 				    ev_window->priv->dbus_object_path, error->message);
