diff -uprEb a/src/dh-window.c b/src/dh-window.c
--- a/src/dh-window.c	2012-11-06 14:13:21.619786140 +0900
+++ b/src/dh-window.c	2012-11-07 00:53:53.192663053 +0900
@@ -54,6 +54,7 @@
 
 #define FULLSCREEN_ANIMATION_SPEED 4
 #define TAB_WIDTH_N_CHARS 15
+#define LINK_UNDER_POINTER_KEY  "dh-window-link-under-pointer"
 
 struct _DhWindowPriv {
         GtkWidget      *main_box;
@@ -66,6 +67,8 @@ struct _DhWindowPriv {
         GtkWidget      *vbox;
         GtkWidget      *findbar;
 
+        GtkWidget      *popup;
+
         GtkWidget      *fullscreen_controls;
         guint           fullscreen_animation_timeout_id;
         gboolean        fullscreen_animation_enter;
@@ -578,6 +581,34 @@ leave_fullscreen_cb (GSimpleAction *acti
         g_action_change_state (G_ACTION (fs_action), g_variant_new_boolean (FALSE));
 }
 
+#ifndef HAVE_WEBKIT2
+static void
+select_all_cb (GSimpleAction     *action,
+                   GVariant      *parameter,
+                   gpointer       data)
+{
+        DhWindow *window = data;
+        WebKitWebView *web_view;
+
+        web_view = window_get_active_web_view (window);
+        webkit_web_view_select_all (web_view);
+}
+
+static void
+open_in_tab_cb (GSimpleAction    *action,
+                   GVariant      *parameter,
+                   gpointer       data)
+{
+        DhWindow *window = data;
+        WebKitWebView *web_view;
+        const gchar *location; 
+
+        web_view = window_get_active_web_view (window);
+        location = g_object_get_data (G_OBJECT (web_view), LINK_UNDER_POINTER_KEY);
+        window_open_new_tab (window, location, (location != NULL));
+}
+#endif
+
 static GActionEntry win_entries[] = {
         /* file */
         { "new-tab",          new_tab_cb,          NULL, NULL, NULL },
@@ -599,6 +630,11 @@ static GActionEntry win_entries[] = {
         { "go-forward",       go_forward_cb,       NULL, "false", NULL },
         { "go-contents-tab",  go_contents_tab_cb,  NULL, NULL, NULL },
         { "go-search-tab",    go_search_tab_cb,    NULL, NULL, NULL },
+#ifndef HAVE_WEBKIT2
+        /* Selection */
+        { "select-all",       select_all_cb,       NULL, NULL, NULL },
+        { "open-in-tab",      open_in_tab_cb,      NULL, NULL, NULL },
+#endif
 };
 
 static gboolean
@@ -810,6 +846,71 @@ window_fullscreen_controls_show (DhWindo
         gtk_widget_show_all (window->priv->fullscreen_controls);
 }
 
+#define POPUP_ITEM_NAME "dh-popup-item-action-name"
+
+static void
+popup_item_activated_cb (GtkWidget *widget, DhWindow *window)
+{
+        GAction *action;
+        const gchar *action_name;
+
+        action_name = g_object_get_data (G_OBJECT (widget), POPUP_ITEM_NAME);
+
+        if (!action_name)
+                return;
+                
+        action = g_action_map_lookup_action (G_ACTION_MAP (window), action_name);
+
+        if (action)
+                g_action_activate (action, NULL);
+}
+
+static void
+append_popup_item (DhWindow     *window,
+                   GtkWidget    *menu,
+                   const gchar  *item_label,
+                   const gchar  *item_name,
+                   gboolean     from_stock)
+{
+        GtkWidget *item;
+
+        if (item_label) {
+                if (from_stock)
+                        item = gtk_image_menu_item_new_from_stock (item_label, NULL);
+                else
+                        item = gtk_menu_item_new_with_mnemonic (item_label);
+
+                g_object_set_data_full (G_OBJECT (item),
+                                        POPUP_ITEM_NAME,
+                                        g_strdup (item_name),
+                                        (GDestroyNotify) g_free);
+
+                g_signal_connect (item, "activate",
+                                        G_CALLBACK (popup_item_activated_cb),
+                                        window);
+        } else {
+                item = gtk_separator_menu_item_new ();
+        }
+
+        gtk_menu_shell_insert (GTK_MENU_SHELL (menu), item, -1);
+}
+
+static GtkWidget*
+create_popup_menu (DhWindow *window)
+{
+        GtkWidget *menu;
+
+        menu = gtk_menu_new ();
+        append_popup_item (window, menu, _("_Copy"), "copy", FALSE);
+#ifndef HAVE_WEBKIT2
+        append_popup_item (window, menu, GTK_STOCK_SELECT_ALL, "select-all", TRUE);
+#endif
+        append_popup_item (window, menu, _("_Find"), "find", FALSE);
+        append_popup_item (window, menu, _("New _Tab"), "open-in-tab", FALSE);
+        gtk_widget_show_all (menu);
+        return menu;
+}
+
 static void
 dh_window_init (DhWindow *window)
 {
@@ -848,6 +949,7 @@ dh_window_init (DhWindow *window)
                                          win_entries, G_N_ELEMENTS (win_entries),
                                          window);
 
+        priv->popup = create_popup_menu (window);
         accel_group = gtk_accel_group_new ();
         gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
         for (i = 0; i < G_N_ELEMENTS (tab_accel_keys); i++) {
@@ -1368,6 +1470,13 @@ window_web_view_button_press_event_cb (W
                                        DhWindow       *window)
 {
         if (event->button == 3) {
+                gtk_menu_popup (GTK_MENU (window->priv->popup),
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                event->button,
+                                event->time);
                 return TRUE;
         }
 
@@ -1570,6 +1679,32 @@ window_web_view_tab_accel_cb (GtkAccelGr
         }
 }
 
+static void
+window_web_view_hovering_over_link_cb (WebKitWebView *web_view,
+                                        gchar         *title,
+                                        gchar         *uri,
+                                        gpointer       user_data)
+{
+        /* I save link as user data in the object to
+          automate freeing memory. When instead the data
+          is written NULL, the data will be freed.
+          
+          This link saved to opening them in the new
+          tab via popup menu. If uri == NULL, then
+          new tab will be opened is empty and background.
+        */
+        if (uri != NULL &&  g_str_has_prefix (uri, "file:/")) {
+                g_object_set_data_full (G_OBJECT (web_view),
+                                        LINK_UNDER_POINTER_KEY,
+                                        g_strdup (uri),
+                                        g_free);
+        } else {
+                g_object_set_data (G_OBJECT (web_view),
+                                        LINK_UNDER_POINTER_KEY,
+                                        NULL);
+        }
+}
+
 static int
 window_open_new_tab (DhWindow    *window,
                      const gchar *location,
@@ -1652,6 +1787,10 @@ window_open_new_tab (DhWindow    *window
         g_signal_connect (view, "navigation-policy-decision-requested",
                           G_CALLBACK (window_web_view_navigation_policy_decision_requested),
                           window);
+
+        g_signal_connect (view, "hovering-over-link",
+                          G_CALLBACK (window_web_view_hovering_over_link_cb),
+                          window);
 #endif
 #ifdef HAVE_WEBKIT2
         g_signal_connect (view, "load-failed",
