diff --git a/data/ui/epiphany-ui.xml b/data/ui/epiphany-ui.xml
index c478903..70b8711 100644
--- a/data/ui/epiphany-ui.xml
+++ b/data/ui/epiphany-ui.xml
@@ -20,6 +20,7 @@
 	</popup>
 
 	<popup name="EphyDocumentPopup" action="PopupAction">
+		<menuitem name="GoBackToApplicationDP" action="NavigationBackToApplication"/>
 		<menuitem name="GoBackDP" action="NavigationBack"/>
 		<menuitem name="GoForwardDP" action="NavigationForward"/>
 		<menuitem name="GoReloadDP" action="ViewReload"/>
@@ -42,6 +43,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 c359afa..2a727a2 100644
--- a/embed/ephy-embed-shell.c
+++ b/embed/ephy-embed-shell.c
@@ -57,6 +57,9 @@ struct _EphyEmbedShellPrivate
 	GtkPageSetup *page_setup;
 	GtkPrintSettings *print_settings;
 	EphyEmbedShellMode mode;
+	char *app_mode_origin;
+	char *app_mode_launch_uri;
+	char *app_mode_title;
 	guint single_initialised : 1;
 };
 
@@ -74,6 +77,9 @@ enum
 {
 	PROP_0,
 	PROP_MODE,
+	PROP_APP_MODE_ORIGIN,
+	PROP_APP_MODE_LAUNCH_URI,
+	PROP_APP_MODE_TITLE,
 	N_PROPERTIES
 };
 
@@ -269,6 +275,21 @@ 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;
+  case PROP_APP_MODE_LAUNCH_URI:
+	  if (embed_shell->priv->app_mode_launch_uri)
+		  g_free (embed_shell->priv->app_mode_launch_uri);
+	  embed_shell->priv->app_mode_launch_uri = g_value_dup_string (value);
+	  break;
+  case PROP_APP_MODE_TITLE:
+	  if (embed_shell->priv->app_mode_title)
+		  g_free (embed_shell->priv->app_mode_title);
+	  embed_shell->priv->app_mode_title = g_value_dup_string (value);
+	  break;
   default:
 	  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
   }
@@ -287,6 +308,15 @@ 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;
+  case PROP_APP_MODE_LAUNCH_URI:
+	  g_value_set_string (value, embed_shell->priv->app_mode_launch_uri);
+	  break;
+  case PROP_APP_MODE_TITLE:
+	  g_value_set_string (value, embed_shell->priv->app_mode_title);
+	  break;
   default:
 	  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
   }
@@ -302,6 +332,9 @@ ephy_embed_shell_init (EphyEmbedShell *shell)
 	embed_shell = shell;
 
 	shell->priv->downloads = NULL;
+	shell->priv->app_mode_origin = NULL;
+	shell->priv->app_mode_title = NULL;
+	shell->priv->app_mode_launch_uri = NULL;
 }
 
 static void
@@ -325,6 +358,30 @@ 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);
+	
+	object_properties[PROP_APP_MODE_TITLE] =
+		g_param_spec_string ("app-mode-title",
+				     "Application mode app name",
+				     "The app name for the application mode .",
+				     NULL,
+				     G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK |
+				     G_PARAM_STATIC_BLURB | G_PARAM_CONSTRUCT_ONLY);
+	
+	object_properties[PROP_APP_MODE_LAUNCH_URI] =
+		g_param_spec_string ("app-mode-launch-uri",
+				     "Application mode launch URI",
+				     "The launch URI 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);
@@ -634,3 +691,44 @@ 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;
+}
+
+/**
+ * ephy_embed_shell_get_app_mode_launch_uri:
+ * @shell: an #EphyEmbedShell
+ * 
+ * Returns: the launch URI for app mode if it is set
+ **/
+const char *
+ephy_embed_shell_get_app_mode_launch_uri (EphyEmbedShell *shell)
+{
+	g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
+	
+	return shell->priv->app_mode_launch_uri;
+}
+/**
+ * ephy_embed_shell_get_app_mode_title:
+ * @shell: an #EphyEmbedShell
+ * 
+ * Returns: the title  for app mode if it is set
+ **/
+const char *
+ephy_embed_shell_get_app_mode_title (EphyEmbedShell *shell)
+{
+	g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
+	
+	return shell->priv->app_mode_title;
+}
diff --git a/embed/ephy-embed-shell.h b/embed/ephy-embed-shell.h
index 97ec38a..1ba889e 100644
--- a/embed/ephy-embed-shell.h
+++ b/embed/ephy-embed-shell.h
@@ -107,6 +107,9 @@ 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);
+const char *       ephy_embed_shell_get_app_mode_launch_uri (EphyEmbedShell *shell);
+const char *       ephy_embed_shell_get_app_mode_title  (EphyEmbedShell *shell);
 
 G_END_DECLS
 
diff --git a/embed/ephy-web-app-utils.c b/embed/ephy-web-app-utils.c
index 6c3c4d3..5ebc468 100644
--- a/embed/ephy-web-app-utils.c
+++ b/embed/ephy-web-app-utils.c
@@ -172,6 +172,7 @@ out:
 #define EPHY_WEB_APP_TOOLBAR "<?xml version=\"1.0\"?>" \
                              "<toolbars version=\"1.1\">" \
                              "  <toolbar name=\"DefaultToolbar\" hidden=\"true\" editable=\"false\">" \
+                             "    <toolitem name=\"NavigationBackToApplication\"/>" \
                              "    <toolitem name=\"NavigationBack\"/>" \
                              "    <toolitem name=\"NavigationForward\"/>" \
                              "    <toolitem name=\"ViewReload\"/>" \
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..189b5f4 100644
--- a/src/ephy-main.c
+++ b/src/ephy-main.c
@@ -379,6 +379,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);
@@ -434,32 +444,63 @@ main (int argc,
   ephy_file_load_accels ();
 
   /* Now create the shell */
-  if (private_instance)
+  if (private_instance) {
     mode = EPHY_EMBED_SHELL_MODE_PRIVATE;
-  else if (application_mode) {
-    char *app_name;
+    _ephy_shell_create_instance (mode);
+  } else if (application_mode) {
+    char *profile_directory_basename, *profile_directory_basename_no_prefix,
+      *desktop_file, *desktop_file_path;
+    char *app_name = NULL;
     char *app_icon;
+    char *app_mode_origin;
+    char *contents;
+
+    SoupURI *soup_uri;
 
     mode = EPHY_EMBED_SHELL_MODE_APPLICATION;
 
-    app_name = g_strrstr (profile_directory, EPHY_WEB_APP_PREFIX);
-    app_icon = g_build_filename (profile_directory, EPHY_WEB_APP_ICON_NAME, NULL);
+    profile_directory_basename = g_path_get_basename (profile_directory);
+    profile_directory_basename_no_prefix = strstr (profile_directory_basename, EPHY_WEB_APP_PREFIX);
+    if (profile_directory_basename_no_prefix)
+      profile_directory_basename_no_prefix += strlen (EPHY_WEB_APP_PREFIX);
+    desktop_file = g_strconcat (profile_directory_basename_no_prefix, ".desktop", NULL);
+    desktop_file_path = g_build_filename (profile_directory, desktop_file, NULL);
+    g_free (desktop_file);
 
-    if (app_name) {
-      /* Skip the 'app-' part */
-      app_name += strlen (EPHY_WEB_APP_PREFIX);
+    app_icon = g_build_filename (profile_directory, EPHY_WEB_APP_ICON_NAME, NULL);
+    gtk_window_set_default_icon_from_file (app_icon, NULL);
 
-      g_set_prgname (app_name);
-      g_set_application_name (app_name);
+    if (g_file_get_contents (desktop_file_path, &contents, NULL, NULL)) {
+      GKeyFile *key;
 
-      gtk_window_set_default_icon_from_file (app_icon, NULL);
+      key = g_key_file_new ();
+      g_key_file_load_from_data (key, contents, -1, 0, NULL);
+      app_name = g_key_file_get_string (key, "Desktop Entry", "Name", NULL);
 
-      /* We need to re-set this because we have already parsed the
-       * options, which inits GTK+ and sets this as a side effect. */
-      gdk_set_program_class (app_name);
+      g_key_file_free (key);
     }
 
+    g_set_prgname (app_name);
+    g_set_application_name (app_name);
+      
+    /* We need to re-set this because we have already parsed the
+     * options, which inits GTK+ and sets this as a side effect. */
+    gdk_set_program_class (app_name);
+
+    g_free (contents);
+    g_free (profile_directory_basename);
+    g_free (desktop_file_path);
     g_free (app_icon);
+
+    soup_uri = soup_uri_new (arguments[0]);
+    app_mode_origin = g_strdup (soup_uri->host);
+    soup_uri_free (soup_uri);
+
+    _ephy_shell_create_web_application_instance (mode,
+                                                 app_mode_origin,
+                                                 arguments[0],
+                                                 app_name);
+    g_free (app_mode_origin);
   } else {
     mode = EPHY_EMBED_SHELL_MODE_BROWSER;
 
@@ -467,9 +508,9 @@ main (int argc,
     g_set_application_name (_("Web"));
 
     gtk_window_set_default_icon_name ("web-browser");
-  }
 
-  _ephy_shell_create_instance (mode);
+    _ephy_shell_create_instance (mode);
+  }
 
   startup_flags = get_startup_flags ();
   ctx = ephy_shell_startup_context_new (startup_flags,
diff --git a/src/ephy-navigation-history-action.c b/src/ephy-navigation-history-action.c
index f0f0a5e..c9f0872 100644
--- a/src/ephy-navigation-history-action.c
+++ b/src/ephy-navigation-history-action.c
@@ -96,6 +96,32 @@ action_activate (GtkAction *action)
     }
     webkit_web_view_go_back (web_view);
     gtk_widget_grab_focus (GTK_WIDGET (embed));
+  } else if (history_action->priv->direction == EPHY_NAVIGATION_HISTORY_DIRECTION_BACK_TO_WEB_APP) {
+    WebKitWebBackForwardList *history;
+    GList *back_list, *node;
+    gboolean found = FALSE;
+
+    history = webkit_web_view_get_back_forward_list (EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed));
+    back_list = webkit_web_back_forward_list_get_back_list_with_limit (history, 3);
+    for (node = back_list; node != NULL; node = g_list_next (node)) {
+      WebKitWebHistoryItem *back_item = (WebKitWebHistoryItem *) node->data;
+      SoupURI *soup_uri;
+      
+      soup_uri = soup_uri_new (webkit_web_history_item_get_uri (back_item));
+
+      if (soup_uri && g_strcmp0 (soup_uri->host, ephy_embed_shell_get_app_mode_origin (embed_shell)) == 0) {
+	webkit_web_view_go_to_back_forward_item (web_view, back_item);
+	found = TRUE;
+	break;
+      }
+      if (soup_uri) soup_uri_free (soup_uri);
+    }
+    if (!found) {
+	webkit_web_view_load_uri (web_view, ephy_embed_shell_get_app_mode_launch_uri (embed_shell));
+	webkit_web_back_forward_list_clear (history);
+    }
+    gtk_widget_grab_focus (GTK_WIDGET (embed));
+
   } else if (history_action->priv->direction == EPHY_NAVIGATION_HISTORY_DIRECTION_FORWARD) {
     if (ephy_gui_is_middle_click () ||
         ephy_link_action_get_button (EPHY_LINK_ACTION (history_action)) == 2) {
diff --git a/src/ephy-navigation-history-action.h b/src/ephy-navigation-history-action.h
index d455e86..69069ed 100644
--- a/src/ephy-navigation-history-action.h
+++ b/src/ephy-navigation-history-action.h
@@ -40,7 +40,8 @@ G_BEGIN_DECLS
 typedef enum
 {
   EPHY_NAVIGATION_HISTORY_DIRECTION_BACK,
-  EPHY_NAVIGATION_HISTORY_DIRECTION_FORWARD
+  EPHY_NAVIGATION_HISTORY_DIRECTION_FORWARD,
+  EPHY_NAVIGATION_HISTORY_DIRECTION_BACK_TO_WEB_APP
 } EphyNavigationHistoryDirection;
 
 typedef struct _EphyNavigationHistoryAction		EphyNavigationHistoryAction;
diff --git a/src/ephy-shell.c b/src/ephy-shell.c
index 510017a..597082d 100644
--- a/src/ephy-shell.c
+++ b/src/ephy-shell.c
@@ -1074,6 +1074,25 @@ _ephy_shell_create_instance (EphyEmbedShellMode mode)
   g_assert (ephy_shell != NULL);
 }
 
+void
+_ephy_shell_create_web_application_instance (EphyEmbedShellMode mode,
+                                             const char *origin,
+                                             const char *launch_uri,
+                                             const char *title)
+{
+  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", origin,
+                                         "app-mode-title", title,
+                                         "app-mode-launch-uri", launch_uri,
+                                         NULL));
+  /* FIXME weak ref */
+  g_assert (ephy_shell != NULL);
+}
+
 /**
  * ephy_shell_set_startup_context:
  * @shell: A #EphyShell
diff --git a/src/ephy-shell.h b/src/ephy-shell.h
index 1780a2e..6a251a7 100644
--- a/src/ephy-shell.h
+++ b/src/ephy-shell.h
@@ -152,6 +152,10 @@ EphyShellStartupContext *ephy_shell_startup_context_new (EphyStartupFlags startu
 
 /* private API */
 void           _ephy_shell_create_instance              (EphyEmbedShellMode mode);
+void           _ephy_shell_create_web_application_instance (EphyEmbedShellMode mode,
+                                                            const char *origin,
+                                                            const char *launch_uri,
+                                                            const char *title);
 
 G_END_DECLS
 
diff --git a/src/ephy-toolbar.c b/src/ephy-toolbar.c
index 6e10753..1ba4386 100644
--- a/src/ephy-toolbar.c
+++ b/src/ephy-toolbar.c
@@ -99,6 +99,19 @@ ephy_toolbar_constructed (GObject *object)
   back_forward = gtk_tool_item_new ();
   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
+  /* Back to application*/
+  tool_button = gtk_button_new ();
+  /* FIXME: apparently we need an image inside the button for the action
+   * icon to appear. */
+  gtk_button_set_image (GTK_BUTTON (tool_button), gtk_image_new ());
+  action_group = ephy_window_get_toolbar_action_group (priv->window);
+  action = gtk_action_group_get_action (action_group, "NavigationBackToApplication");
+  gtk_action_set_always_show_image (action, TRUE);
+
+  gtk_activatable_set_related_action (GTK_ACTIVATABLE (tool_button),
+                                      action);
+  gtk_container_add (GTK_CONTAINER (box), GTK_WIDGET (tool_button));
+
   /* Back */
   tool_button = ephy_middle_clickable_button_new ();
   /* FIXME: apparently we need an image inside the button for the action
@@ -163,6 +176,17 @@ ephy_toolbar_constructed (GObject *object)
   gtk_widget_set_margin_right (GTK_WIDGET (location_stop_reload), 12);
   gtk_widget_show_all (GTK_WIDGET (location_stop_reload));
 
+  /* 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_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));
+
   /* Page Menu */
   tool_item = gtk_tool_item_new ();
   tool_button = gtk_button_new ();
diff --git a/src/ephy-window.c b/src/ephy-window.c
index 0636d55..d3a495d 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 = soup_uri && (g_strcmp0 (soup_uri->host, ephy_embed_shell_get_app_mode_origin (embed_shell)) != 0);
+			if (soup_uri) soup_uri_free (soup_uri);
+		} else {
+			*show_toolbar = FALSE;
+		}
+
 		*show_tabsbar = FALSE;
 	}
 	else
@@ -1321,6 +1341,17 @@ setup_ui_manager (EphyWindow *window)
 	action_group = gtk_action_group_new ("SpecialToolbarActions");
 	action =
 		g_object_new (EPHY_TYPE_NAVIGATION_HISTORY_ACTION,
+			      "name", "NavigationBackToApplication",
+			      "label", _("Back to application"),
+			      "icon-name", "go-previous-symbolic",
+			      "window", window,
+			      "direction", EPHY_NAVIGATION_HISTORY_DIRECTION_BACK_TO_WEB_APP,
+			      NULL);
+	gtk_action_group_add_action (action_group, action);
+	g_object_unref (action);
+
+	action =
+		g_object_new (EPHY_TYPE_NAVIGATION_HISTORY_ACTION,
 			      "name", "NavigationBack",
 			      "label", _("Back"),
 			      "icon-name", "go-previous-symbolic",
@@ -1344,6 +1375,19 @@ setup_ui_manager (EphyWindow *window)
 	g_object_unref (action);
 
 	action =
+		g_object_new (EPHY_TYPE_WINDOW_ACTION,
+			      "name", "NavigationOpenInBrowser",
+			      "label", _("Open as Web page"),
+			      "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 +1444,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 +2179,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;
@@ -3155,6 +3200,12 @@ setup_toolbar (EphyWindow *window)
 			    toolbar, FALSE, FALSE, 0);
 
 	action = gtk_action_group_get_action (priv->toolbar_action_group,
+					      "NavigationBackToApplication");
+	gtk_action_set_visible (action, FALSE);
+	g_signal_connect_swapped (action, "open-link",
+				  G_CALLBACK (ephy_link_open), window);
+
+	action = gtk_action_group_get_action (priv->toolbar_action_group,
 					      "NavigationBack");
 	g_signal_connect_swapped (action, "open-link",
 				  G_CALLBACK (ephy_link_open), window);
@@ -3344,8 +3395,26 @@ 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, "NavigationBackToApplication");
+	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)
 	{
+		char *back_to_application_label;
+
+		back_to_application_label = g_strdup_printf(_("Back to %s"), ephy_embed_shell_get_app_mode_title (embed_shell));
+		action = gtk_action_group_get_action (priv->toolbar_action_group, "NavigationBackToApplication");
+		gtk_action_set_label (action, back_to_application_label);
+		g_free (back_to_application_label);
+
 		/* FileNewTab and FileNewWindow are sort of special. */
 		action = gtk_action_group_get_action (toolbar_action_group, "FileNewTab");
 		ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME,
@@ -3357,6 +3426,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 1690628..18ff8a6 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
 
