diff --git a/data/ui/epiphany-ui.xml b/data/ui/epiphany-ui.xml
index c478903..b9f79b7 100644
--- a/data/ui/epiphany-ui.xml
+++ b/data/ui/epiphany-ui.xml
@@ -42,6 +42,7 @@
 		<menuitem name="OpenLinkLP" action="OpenLink"/>
 		<menuitem name="OpenLinkInNewTabLP" action="OpenLinkInNewTab"/>
 		<menuitem name="OpenLinkInNewWindowLP" action="OpenLinkInNewWindow"/>
+		<menuitem name="OpenLinkInBrowserLP" action="OpenLinkInBrowser"/>
 		<separator name="LPSep1"/>
 		<menuitem name="EditCopyLP" action="EditCopy"/>
 		<separator name="LPSep2"/>
diff --git a/embed/ephy-embed-shell.c b/embed/ephy-embed-shell.c
index cda96e2..29f832c 100644
--- a/embed/ephy-embed-shell.c
+++ b/embed/ephy-embed-shell.c
@@ -61,6 +61,7 @@ struct _EphyEmbedShellPrivate
 	GtkPageSetup *page_setup;
 	GtkPrintSettings *print_settings;
 	EphyEmbedShellMode mode;
+	char *app_mode_origin;
 	guint single_initialised : 1;
 };
 
@@ -78,6 +79,7 @@ enum
 {
 	PROP_0,
 	PROP_MODE,
+	PROP_APP_MODE_ORIGIN,
 	N_PROPERTIES
 };
 
@@ -326,6 +328,11 @@ ephy_embed_shell_set_property (GObject *object,
   case PROP_MODE:
 	  embed_shell->priv->mode = g_value_get_enum (value);
 	  break;
+  case PROP_APP_MODE_ORIGIN:
+	  if (embed_shell->priv->app_mode_origin)
+		  g_free (embed_shell->priv->app_mode_origin);
+	  embed_shell->priv->app_mode_origin = g_value_dup_string (value);
+	  break;
   default:
 	  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
   }
@@ -344,6 +351,9 @@ ephy_embed_shell_get_property (GObject *object,
   case PROP_MODE:
 	  g_value_set_enum (value, embed_shell->priv->mode);
 	  break;
+  case PROP_APP_MODE_ORIGIN:
+	  g_value_set_string (value, embed_shell->priv->app_mode_origin);
+	  break;
   default:
 	  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
   }
@@ -359,6 +369,7 @@ ephy_embed_shell_init (EphyEmbedShell *shell)
 	embed_shell = shell;
 
 	shell->priv->downloads = NULL;
+	shell->priv->app_mode_origin = NULL;
 }
 
 static void
@@ -382,6 +393,14 @@ ephy_embed_shell_class_init (EphyEmbedShellClass *klass)
 				   G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK |
 				   G_PARAM_STATIC_BLURB | G_PARAM_CONSTRUCT_ONLY);
 	
+	object_properties[PROP_APP_MODE_ORIGIN] =
+		g_param_spec_string ("app-mode-origin",
+				     "Application mode origin",
+				     "The origin for the application mode .",
+				     NULL,
+				     G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK |
+				     G_PARAM_STATIC_BLURB | G_PARAM_CONSTRUCT_ONLY);
+	
 	g_object_class_install_properties (object_class,
 					   N_PROPERTIES,
 					   object_properties);
@@ -691,3 +710,17 @@ ephy_embed_shell_get_mode (EphyEmbedShell *shell)
 	
 	return shell->priv->mode;
 }
+
+/**
+ * ephy_embed_shell_get_app_mode_origin:
+ * @shell: an #EphyEmbedShell
+ * 
+ * Returns: the origin for app mode if it is set
+ **/
+const char *
+ephy_embed_shell_get_app_mode_origin (EphyEmbedShell *shell)
+{
+	g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
+	
+	return shell->priv->app_mode_origin;
+}
diff --git a/embed/ephy-embed-shell.h b/embed/ephy-embed-shell.h
index 4bab3a4..447eb74 100644
--- a/embed/ephy-embed-shell.h
+++ b/embed/ephy-embed-shell.h
@@ -111,6 +111,7 @@ void		   ephy_embed_shell_remove_download	(EphyEmbedShell *shell,
 							 EphyDownload *download);
 
 EphyEmbedShellMode ephy_embed_shell_get_mode            (EphyEmbedShell *shell);
+const char *       ephy_embed_shell_get_app_mode_origin (EphyEmbedShell *shell);
 
 G_END_DECLS
 
diff --git a/lib/ephy-file-helpers.c b/lib/ephy-file-helpers.c
index 7c3612b..169fb82 100644
--- a/lib/ephy-file-helpers.c
+++ b/lib/ephy-file-helpers.c
@@ -697,6 +697,40 @@ ephy_file_check_mime (const char *mime_type)
 }
 
 /**
+ * ephy_file_launch_in_browser:
+ * @uri: a URI
+ *
+ * Launch @uri in default system browser.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise
+ */
+gboolean
+ephy_file_launch_in_browser (const char *uri)
+{
+	char *command_line;
+	GError *error = NULL;
+	gboolean return_value = TRUE;
+
+	/* A gross hack to be able to launch epiphany from within
+	 * Epiphany. Might be a good idea to figure out a better
+	 * solution... */
+	g_unsetenv (EPHY_UUID_ENVVAR);
+	command_line = g_strdup_printf ("gvfs-open %s", uri);
+	g_spawn_command_line_async (command_line, &error);
+
+	if (error)
+	{
+		g_debug ("Error opening %s: %s", uri, error->message);
+		g_error_free (error);
+		return_value = FALSE;
+	}
+
+	g_free (command_line);
+
+	return return_value;
+}
+
+/**
  * ephy_file_launch_application:
  * @app: the application to launch
  * @files: files to pass to @app
diff --git a/lib/ephy-file-helpers.h b/lib/ephy-file-helpers.h
index d367835..f5a2ef4 100644
--- a/lib/ephy-file-helpers.h
+++ b/lib/ephy-file-helpers.h
@@ -70,6 +70,7 @@ void               ephy_file_delete_on_exit      (GFile       *file);
 void               ephy_file_add_recent_item     (const char  *uri,
                                                   const char  *mime_type);
 EphyMimePermission ephy_file_check_mime          (const char  *mime_type);
+gboolean           ephy_file_launch_in_browser   (const char *uri);
 gboolean           ephy_file_launch_desktop_file (const char  *filename,
                                                   const char  *parameter,
                                                   guint32      user_time,
diff --git a/src/ephy-main.c b/src/ephy-main.c
index 53f75b8..a312412 100644
--- a/src/ephy-main.c
+++ b/src/ephy-main.c
@@ -243,6 +243,7 @@ main (int argc,
   EphyShellStartupContext *ctx;
   EphyStartupFlags startup_flags;
   EphyEmbedShellMode mode;
+  char *app_mode_origin;
   int status;
 
 #ifdef ENABLE_NLS
@@ -379,6 +380,16 @@ main (int argc,
     exit (1);
   }
 
+  if (application_mode && arguments == NULL) {
+    g_print ("URL should be provided when --application-mode is requested\n");
+    exit (1);
+  }
+
+  if (application_mode && arguments[0] != NULL && arguments[1] != NULL) {
+    g_print ("Only one URL should be provided when --application-mode is requested\n");
+    exit (1);
+  }
+
   if (application_mode && !g_file_test (profile_directory, G_FILE_TEST_IS_DIR)) {
       g_print ("--profile must be an existing directory when --application-mode is requested\n");
       exit (1);
@@ -433,12 +444,15 @@ main (int argc,
 
   ephy_file_load_accels ();
 
+  app_mode_origin = NULL;
+
   /* Now create the shell */
   if (private_instance)
     mode = EPHY_EMBED_SHELL_MODE_PRIVATE;
   else if (application_mode) {
     char *app_name;
     char *app_icon;
+    SoupURI *soup_uri;
 
     mode = EPHY_EMBED_SHELL_MODE_APPLICATION;
 
@@ -460,6 +474,10 @@ main (int argc,
     }
 
     g_free (app_icon);
+
+    soup_uri = soup_uri_new (arguments[0]);
+    app_mode_origin = g_strdup (soup_uri->host);
+    soup_uri_free (soup_uri);
   } else {
     mode = EPHY_EMBED_SHELL_MODE_BROWSER;
 
@@ -469,7 +487,8 @@ main (int argc,
     gtk_window_set_default_icon_name ("web-browser");
   }
 
-  _ephy_shell_create_instance (mode);
+  _ephy_shell_create_instance (mode, app_mode_origin);
+  g_free (app_mode_origin);
 
   startup_flags = get_startup_flags ();
   ctx = ephy_shell_startup_context_new (startup_flags,
diff --git a/src/ephy-shell.c b/src/ephy-shell.c
index 6964cef..f0c2e04 100644
--- a/src/ephy-shell.c
+++ b/src/ephy-shell.c
@@ -1063,13 +1063,15 @@ ephy_shell_get_prefs_dialog (EphyShell *shell)
 }
 
 void
-_ephy_shell_create_instance (EphyEmbedShellMode mode)
+_ephy_shell_create_instance (EphyEmbedShellMode mode,
+                             const char *app_mode_origin)
 {
   g_assert (ephy_shell == NULL);
 
   ephy_shell = EPHY_SHELL (g_object_new (EPHY_TYPE_SHELL,
                                          "application-id", "org.gnome.Epiphany",
                                          "mode", mode,
+                                         "app-mode-origin", app_mode_origin,
                                          NULL));
   /* FIXME weak ref */
   g_assert (ephy_shell != NULL);
diff --git a/src/ephy-shell.h b/src/ephy-shell.h
index 1780a2e..70c35b0 100644
--- a/src/ephy-shell.h
+++ b/src/ephy-shell.h
@@ -151,7 +151,8 @@ EphyShellStartupContext *ephy_shell_startup_context_new (EphyStartupFlags startu
                                                          guint32          user_time);
 
 /* private API */
-void           _ephy_shell_create_instance              (EphyEmbedShellMode mode);
+void           _ephy_shell_create_instance              (EphyEmbedShellMode mode,
+                                                         const char      *app_mode_origin);
 
 G_END_DECLS
 
diff --git a/src/ephy-toolbar.c b/src/ephy-toolbar.c
index 6e10753..db3b067 100644
--- a/src/ephy-toolbar.c
+++ b/src/ephy-toolbar.c
@@ -132,6 +132,18 @@ ephy_toolbar_constructed (GObject *object)
   gtk_widget_show_all (GTK_WIDGET (back_forward));
   gtk_widget_set_margin_right (GTK_WIDGET (back_forward), 12);
 
+  /* Open in browser */
+  tool_item = gtk_tool_item_new ();
+  tool_button = gtk_button_new ();
+  action_group = ephy_window_get_toolbar_action_group (priv->window);
+  action = gtk_action_group_get_action (action_group, "NavigationOpenInBrowser");
+  gtk_activatable_set_related_action (GTK_ACTIVATABLE (tool_button),
+                                      action);
+  gtk_button_set_label (GTK_BUTTON (tool_button), "Open in browser");
+  gtk_container_add (GTK_CONTAINER (tool_item), tool_button);
+  gtk_container_add (GTK_CONTAINER (toolbar), GTK_WIDGET (tool_item));
+  gtk_widget_show_all (GTK_WIDGET (tool_item));
+
   /* Location and Reload/Stop */
   location_stop_reload = gtk_tool_item_new ();
   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
diff --git a/src/ephy-window.c b/src/ephy-window.c
index 0636d55..258fb7a 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -168,6 +168,7 @@ static const GtkActionEntry ephy_menu_entries [] = {
 	  G_CALLBACK (window_cmd_tabs_move_right) },
         { "TabsDetach", NULL, N_("_Detach Tab"), NULL, NULL,
           G_CALLBACK (window_cmd_tabs_detach) },
+
 };
 
 static const GtkToggleActionEntry ephy_menu_toggle_entries [] =
@@ -204,6 +205,8 @@ static const GtkActionEntry ephy_popups_entries [] = {
 	  G_CALLBACK (popup_cmd_link_in_new_window) },
 	{ "OpenLinkInNewTab", NULL, N_("Open Link in New _Tab"), NULL, NULL,
 	  G_CALLBACK (popup_cmd_link_in_new_tab) },
+	{ "OpenLinkInBrowser", NULL, N_("Open Link in _Browser"), NULL, NULL,
+	  G_CALLBACK (popup_cmd_link_in_browser) },
 	{ "DownloadLink", NULL, N_("_Download Link"), NULL,
 	  NULL, G_CALLBACK (popup_cmd_download_link) },
 	{ "DownloadLinkAs", NULL, N_("_Save Link As…"), NULL, NULL,
@@ -698,7 +701,24 @@ get_chromes_visibility (EphyWindow *window,
 
 	if (ephy_embed_shell_get_mode (embed_shell) == EPHY_EMBED_SHELL_MODE_APPLICATION)
 	{
-		*show_toolbar = FALSE;
+		EphyEmbed *embed;
+		const char *address;
+		SoupURI *soup_uri;
+
+		embed = window->priv->active_embed;
+		if (embed) {
+			EphyWebView *web_view;
+
+			web_view = ephy_embed_get_web_view (embed);
+			address = ephy_web_view_get_address (web_view);
+			
+			soup_uri = soup_uri_new (address);
+			*show_toolbar = (g_strcmp0 (soup_uri->host, ephy_embed_shell_get_app_mode_origin (embed_shell)) != 0);
+			soup_uri_free (soup_uri);
+		} else {
+			*show_toolbar = FALSE;
+		}
+
 		*show_tabsbar = FALSE;
 	}
 	else
@@ -1344,6 +1364,18 @@ setup_ui_manager (EphyWindow *window)
 	g_object_unref (action);
 
 	action =
+		g_object_new (EPHY_TYPE_WINDOW_ACTION,
+			      "name", "NavigationOpenInBrowser",
+			      "window", window,
+			      NULL);
+	g_signal_connect (G_OBJECT (action),
+			  "activate",
+			  G_CALLBACK (window_cmd_open_in_browser),
+			  window);
+	gtk_action_group_add_action (action_group, action);
+	g_object_unref (action);
+
+	action =
 		g_object_new (EPHY_TYPE_ZOOM_ACTION,
 			      "name", "Zoom",
 			      "label", _("Zoom"),
@@ -1400,6 +1432,7 @@ sync_tab_address (EphyWebView *view,
 
 	ephy_window_set_location (window, typed_address ? typed_address : address);
 	ephy_find_toolbar_request_close (priv->find_toolbar);
+	sync_chromes_visibility (window);
 }
 
 static void
@@ -2134,48 +2167,48 @@ policy_decision_required_cb (WebKitWebView *web_view,
 		return TRUE;
 	}
 
-	if (reason == WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED &&
-	    ephy_embed_shell_get_mode (embed_shell) == EPHY_EMBED_SHELL_MODE_APPLICATION)
-	{
-		/* The only thing we allow here is to either navigate
-		 * in the same window and tab to the current domain,
-		 * or launch a new (non app mode) epiphany instance
-		 * for all the other cases. */
-		gboolean return_value;
-		SoupURI *soup_uri = soup_uri_new (uri);
-		SoupURI *current_soup_uri = soup_uri_new (webkit_web_view_get_uri (web_view));
-
-		if (g_str_equal (soup_uri->host, current_soup_uri->host))
-		{
-			return_value = FALSE;
-		}
-		else
-		{
-			char *command_line;
-			GError *error = NULL;
-
-			return_value = TRUE;
-			/* A gross hack to be able to launch epiphany from within
-			 * Epiphany. Might be a good idea to figure out a better
-			 * solution... */
-			g_unsetenv (EPHY_UUID_ENVVAR);
-			command_line = g_strdup_printf ("gvfs-open %s", uri);
-			g_spawn_command_line_async (command_line, &error);
-
-			if (error)
-			{
-				g_debug ("Error opening %s: %s", uri, error->message);
-				g_error_free (error);
-			}
-
-			g_free (command_line);
-		}
-
-		soup_uri_free (soup_uri);
-		soup_uri_free (current_soup_uri);
-
-		return return_value;
-	}
+	/* if (reason == WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED && */
+	/*     ephy_embed_shell_get_mode (embed_shell) == EPHY_EMBED_SHELL_MODE_APPLICATION) */
+	/* { */
+	/* 	/\* The only thing we allow here is to either navigate */
+	/* 	 * in the same window and tab to the current domain, */
+	/* 	 * or launch a new (non app mode) epiphany instance */
+	/* 	 * for all the other cases. *\/ */
+	/* 	gboolean return_value; */
+	/* 	SoupURI *soup_uri = soup_uri_new (uri); */
+	/* 	SoupURI *current_soup_uri = soup_uri_new (webkit_web_view_get_uri (web_view)); */
+
+	/* 	if (g_str_equal (soup_uri->host, current_soup_uri->host)) */
+	/* 	{ */
+	/* 		return_value = FALSE; */
+	/* 	} */
+	/* 	else */
+	/* 	{ */
+	/* 		char *command_line; */
+	/* 		GError *error = NULL; */
+
+	/* 		return_value = TRUE; */
+	/* 		/\* A gross hack to be able to launch epiphany from within */
+	/* 		 * Epiphany. Might be a good idea to figure out a better */
+	/* 		 * solution... *\/ */
+	/* 		g_unsetenv (EPHY_UUID_ENVVAR); */
+	/* 		command_line = g_strdup_printf ("gvfs-open %s", uri); */
+	/* 		g_spawn_command_line_async (command_line, &error); */
+
+	/* 		if (error) */
+	/* 		{ */
+	/* 			g_debug ("Error opening %s: %s", uri, error->message); */
+	/* 			g_error_free (error); */
+	/* 		} */
+
+	/* 		g_free (command_line); */
+	/* 	} */
+
+	/* 	soup_uri_free (soup_uri); */
+	/* 	soup_uri_free (current_soup_uri); */
+
+	/* 	return return_value; */
+	/* } */
 
 	if (reason == WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED) {
 		EphyEmbed *embed;
@@ -3344,6 +3377,15 @@ ephy_window_constructor (GType type,
 
 	/* Disabled actions not needed for application mode. */
 	mode = ephy_embed_shell_get_mode (embed_shell);
+	action = gtk_action_group_get_action (priv->popups_action_group, "OpenLinkInBrowser");
+	ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME,
+					      mode != EPHY_EMBED_SHELL_MODE_APPLICATION);
+	gtk_action_set_visible (action, mode == EPHY_EMBED_SHELL_MODE_APPLICATION);
+
+	action = gtk_action_group_get_action (priv->toolbar_action_group, "NavigationOpenInBrowser");
+	gtk_action_set_visible (action, mode == EPHY_EMBED_SHELL_MODE_APPLICATION);
+	action = gtk_action_group_get_action (priv->toolbar_action_group, "PageMenu");
+	gtk_action_set_visible (action, mode != EPHY_EMBED_SHELL_MODE_APPLICATION);
 	if (mode == EPHY_EMBED_SHELL_MODE_APPLICATION)
 	{
 		/* FileNewTab and FileNewWindow are sort of special. */
@@ -3357,6 +3399,7 @@ ephy_window_constructor (GType type,
 							      disabled_actions_for_app_mode[i]);
 			ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, TRUE);
 		}
+		g_object_set (G_OBJECT (priv->location_controller), "editable", FALSE, NULL);
 	}
 
 	/* ensure the UI is updated */
diff --git a/src/popup-commands.c b/src/popup-commands.c
index 5860b46..051e268 100644
--- a/src/popup-commands.c
+++ b/src/popup-commands.c
@@ -86,6 +86,22 @@ popup_cmd_link_in_new_tab (GtkAction *action,
 }
 
 void
+popup_cmd_link_in_browser (GtkAction *action,
+		           EphyWindow *window)
+{
+	EphyEmbedEvent *event;
+	GValue value = { 0, };
+
+	event = ephy_window_get_context_event (window);
+	g_return_if_fail (event != NULL);
+
+	ephy_embed_event_get_property (event, "link-uri", &value);
+
+	ephy_file_launch_in_browser (g_value_get_string (&value));
+	g_value_unset (&value);
+}
+
+void
 popup_cmd_bookmark_link (GtkAction *action,
 			 EphyWindow *window)
 {
diff --git a/src/popup-commands.h b/src/popup-commands.h
index cabecdf..c0ec27a 100644
--- a/src/popup-commands.h
+++ b/src/popup-commands.h
@@ -27,6 +27,9 @@ void popup_cmd_link_in_new_window	(GtkAction *action,
 void popup_cmd_link_in_new_tab		(GtkAction *action,
 					 EphyWindow *window);
 
+void popup_cmd_link_in_browser		(GtkAction *action,
+					 EphyWindow *window);
+
 void popup_cmd_bookmark_link		(GtkAction *action,
 					 EphyWindow *window);
 
diff --git a/src/window-commands.c b/src/window-commands.c
index 70fc0cf..6c90854 100644
--- a/src/window-commands.c
+++ b/src/window-commands.c
@@ -1399,3 +1399,17 @@ window_cmd_browse_with_caret (GtkAction *action,
 	g_settings_set_boolean (EPHY_SETTINGS_MAIN,
 				EPHY_PREFS_ENABLE_CARET_BROWSING, active);
 }
+
+void
+window_cmd_open_in_browser (GtkAction *action,
+			    EphyWindow *window)
+{
+	const char *location;
+
+	location = ephy_window_get_location (window);
+
+	if (location)
+	{
+		ephy_file_launch_in_browser (location);
+	}
+}
diff --git a/src/window-commands.h b/src/window-commands.h
index 8c1840b..0e3cd27 100644
--- a/src/window-commands.h
+++ b/src/window-commands.h
@@ -100,6 +100,8 @@ void window_cmd_load_location            (GtkAction  *action,
                                           EphyWindow *window);
 void window_cmd_browse_with_caret        (GtkAction  *action,
                                           EphyWindow *window);
+void window_cmd_open_in_browser          (GtkAction  *action,
+					  EphyWindow *window);
 
 G_END_DECLS
 
diff --git a/tests/ephy-download-test.c b/tests/ephy-download-test.c
index 2ebb08a..fa2d1d3 100644
--- a/tests/ephy-download-test.c
+++ b/tests/ephy-download-test.c
@@ -178,7 +178,7 @@ main (int argc, char *argv[])
 
   ephy_debug_init ();
   ephy_embed_prefs_init ();
-  _ephy_shell_create_instance (FALSE);
+  _ephy_shell_create_instance (FALSE, NULL);
 
   if (!ephy_file_helpers_init (NULL, TRUE, FALSE, NULL)) {
     g_debug ("Something wrong happened with ephy_file_helpers_init()");
diff --git a/tests/ephy-embed-single-test.c b/tests/ephy-embed-single-test.c
index 2b4768b..805b9a9 100644
--- a/tests/ephy-embed-single-test.c
+++ b/tests/ephy-embed-single-test.c
@@ -84,7 +84,7 @@ main (int argc, char *argv[])
 
   ephy_debug_init ();
   ephy_embed_prefs_init ();
-  _ephy_shell_create_instance (FALSE);
+  _ephy_shell_create_instance (FALSE, NULL);
 
   if (!ephy_file_helpers_init (NULL, TRUE, FALSE, NULL)) {
     g_debug ("Something wrong happened with ephy_file_helpers_init()");
diff --git a/tests/ephy-web-view-test.c b/tests/ephy-web-view-test.c
index 6afd0a5..134d238 100644
--- a/tests/ephy-web-view-test.c
+++ b/tests/ephy-web-view-test.c
@@ -250,7 +250,7 @@ main (int argc, char *argv[])
     return -1;
   }
 
-  _ephy_shell_create_instance (FALSE);
+  _ephy_shell_create_instance (FALSE, NULL);
 
   server = soup_server_new (SOUP_SERVER_PORT, SERVER_PORT, NULL);
   soup_server_add_handler (server, NULL, server_callback, NULL, NULL);
