diff --git a/embed/webkit/webkit-embed.c b/embed/webkit/webkit-embed.c
index 87173fb..86bc542 100644
--- a/embed/webkit/webkit-embed.c
+++ b/embed/webkit/webkit-embed.c
@@ -71,6 +71,7 @@ struct WebKitEmbedPrivate
   GtkScrolledWindow *scrolled_window;
   WebKitEmbedLoadState load_state;
   char *loading_uri;
+  char *link_uri;
   EphyHistory *history;
   GtkWidget *inspector_window;
   guint is_setting_zoom : 1;
@@ -145,6 +146,128 @@ title_changed_cb (WebKitWebView *web_view,
 }
 
 static void
+new_tab_activate_cb (GtkWidget *widget,
+                     EphyEmbed *embed)
+{
+  WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+  gchar *location = wembed->priv->link_uri;
+
+  ephy_shell_new_tab (ephy_shell_get_default(),
+                      NULL,
+                      embed,
+                      location,
+                      1 << 7);
+
+  g_print ("OPEN NEW TAB: %s\n", location);
+}
+
+static void
+bookmark_link_activate_cb (GtkWidget *widget,
+                           EphyEmbed *embed)
+{
+  WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+  gchar *location = wembed->priv->link_uri;
+
+  g_print ("BOOKMARK ADD:%s\n", location);
+}
+
+static void
+populate_popup_cb (WebKitWebView *web_view,
+                   GtkMenu *menu,
+                   EphyEmbed *embed)
+{
+  GtkWidget* menuitem;
+  GtkWidget* icon;
+  gchar* stock_id;
+  GList* items;
+  gboolean has_selection;
+  gchar *location;
+  GtkWidget *label;
+  WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+
+  location = wembed->priv->link_uri;
+  has_selection = webkit_web_view_has_selection (web_view);
+
+  /* Unfortunately inspecting the menu is the only way to
+     determine that the mouse is over a text area or selection. */
+  items = gtk_container_get_children (GTK_CONTAINER (menu));
+  menuitem = (GtkWidget*)g_list_nth_data (items, 0);
+  g_list_free (items);
+
+  if (GTK_IS_IMAGE_MENU_ITEM (menuitem))
+    {
+      icon = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (menuitem));
+      gtk_image_get_stock (GTK_IMAGE (icon), &stock_id, NULL);
+      if (!strcmp (stock_id, GTK_STOCK_CUT))
+        return;
+      if (strcmp (stock_id, GTK_STOCK_FIND))
+        has_selection = FALSE;
+    }
+
+  if (location)
+    {
+      items = gtk_container_get_children (GTK_CONTAINER (menu));
+      menuitem = (GtkWidget*)g_list_nth_data (items, 0);
+
+      /* hack to localize menu item */
+      label = gtk_bin_get_child (GTK_BIN (menuitem));
+      gtk_label_set_label (GTK_LABEL (label), _("Open _Link"));
+
+      icon = gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU);
+      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon);
+
+      /* Open in new tab */
+      menuitem = gtk_menu_item_new_with_mnemonic (
+               _("Open Link in New _Tab"));
+      gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 1);
+      g_signal_connect (menuitem,
+                        "activate",
+                        G_CALLBACK (new_tab_activate_cb),
+                        embed);
+      gtk_widget_show (menuitem);
+
+      /* Hide Open in New Window icon */
+      menuitem = (GtkWidget*)g_list_nth_data (items, 1);
+      label = gtk_bin_get_child (GTK_BIN (menuitem));
+      gtk_label_set_label (GTK_LABEL (label), _("Open Link in New _Window"));
+      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem),
+                                     NULL);
+
+      /* Separate action links */
+      menuitem = gtk_separator_menu_item_new ();
+      gtk_menu_shell_insert (GTK_MENU_SHELL (menu),
+                             menuitem, 3);
+      gtk_widget_show (GTK_WIDGET(menuitem));
+
+      /* Download link */
+      menuitem = (GtkWidget*)g_list_nth_data (items, 2);
+      label = gtk_bin_get_child (GTK_BIN (menuitem));
+      gtk_label_set_label (GTK_LABEL (label), _("_Save Link As..."));
+      icon = gtk_image_new_from_stock (GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU);
+      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon);
+
+      /* Bookmark */
+      menuitem = gtk_image_menu_item_new_with_mnemonic (
+               _("_Bookmark Link..."));
+      icon = gtk_image_new_from_stock ("bookmark-new", GTK_ICON_SIZE_MENU);
+      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon);
+      gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 4);
+      g_signal_connect (menuitem,
+                        "activate",
+                        G_CALLBACK(bookmark_link_activate_cb),
+                        embed);
+      gtk_widget_show (menuitem);
+
+      /* Copy Link */
+      menuitem = (GtkWidget*)g_list_nth_data (items, 3);
+      label = gtk_bin_get_child (GTK_BIN (menuitem));
+      gtk_label_set_label (GTK_LABEL (label), _("_Copy Link Address"));
+      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem),
+                                     NULL);
+    }
+}
+
+static void
 update_load_state (WebKitEmbed *embed, WebKitWebView *web_view)
 {
   EphyEmbedNetState estate = EPHY_EMBED_STATE_UNKNOWN;
@@ -286,6 +409,12 @@ hovering_over_link_cb (WebKitWebView *web_view,
                        char *location,
                        EphyEmbed *embed)
 {
+  WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+
+  /* Save hovering link for populate menu later */
+  g_free (wembed->priv->link_uri);
+  wembed->priv->link_uri = g_strdup(location);
+
   ephy_base_embed_set_link_message (EPHY_BASE_EMBED (embed), location);
 }
 
@@ -563,6 +692,7 @@ webkit_embed_init (WebKitEmbed *embed)
   embed->priv = WEBKIT_EMBED_GET_PRIVATE (embed);
 
   sw = gtk_scrolled_window_new (NULL, NULL);
+  embed->priv->link_uri = NULL;
   embed->priv->scrolled_window = GTK_SCROLLED_WINDOW (sw);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
@@ -585,6 +715,7 @@ webkit_embed_init (WebKitEmbed *embed)
                     "signal::download-requested", G_CALLBACK (download_requested_cb), embed,
                     "signal::notify::zoom-level", G_CALLBACK (zoom_changed_cb), embed,
                     "signal::notify::title", G_CALLBACK (title_changed_cb), embed,
+                    "signal::populate-popup", G_CALLBACK (populate_popup_cb), embed,
                     NULL);
 
   embed->priv->inspector_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
