diff --git a/src/terminal-screen.c b/src/terminal-screen.c
index f6cc4a52..010ec8a4 100644
--- a/src/terminal-screen.c
+++ b/src/terminal-screen.c
@@ -99,6 +99,7 @@ enum
   PROFILE_SET,
   SHOW_POPUP_MENU,
   MATCH_CLICKED,
+  MATCH_COPY,
   CLOSE_SCREEN,
   LAST_SIGNAL
 };
@@ -522,6 +523,16 @@ terminal_screen_class_init (TerminalScreenClass *klass)
                   G_TYPE_BOOLEAN,
                   3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_UINT);
   
+  signals[MATCH_COPY] =
+    g_signal_new (I_("match-copy"),
+                  G_OBJECT_CLASS_TYPE (object_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (TerminalScreenClass, match_copy),
+                  g_signal_accumulator_true_handled, NULL,
+                  _terminal_marshal_BOOLEAN__STRING_INT_UINT,
+                  G_TYPE_BOOLEAN,
+                  3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_UINT);
+
   signals[CLOSE_SCREEN] =
     g_signal_new (I_("close-screen"),
                   G_OBJECT_CLASS_TYPE (object_class),
@@ -1597,7 +1608,7 @@ terminal_screen_button_press (GtkWidget      *widget,
     {
       gboolean handled = FALSE;
 
-      g_signal_emit (screen, signals[MATCH_CLICKED], 0,
+      g_signal_emit (screen, signals[(state & GDK_SHIFT_MASK) ? MATCH_COPY : MATCH_CLICKED], 0,
                      hyperlink,
                      FLAVOR_AS_IS,
                      state,
@@ -1612,7 +1623,7 @@ terminal_screen_button_press (GtkWidget      *widget,
     {
       gboolean handled = FALSE;
 
-      g_signal_emit (screen, signals[MATCH_CLICKED], 0,
+      g_signal_emit (screen, signals[(state & GDK_SHIFT_MASK) ? MATCH_COPY : MATCH_CLICKED], 0,
                      url,
                      url_flavor,
                      state,
diff --git a/src/terminal-screen.h b/src/terminal-screen.h
index 2e8f6dc6..beff8bb3 100644
--- a/src/terminal-screen.h
+++ b/src/terminal-screen.h
@@ -68,6 +68,10 @@ struct _TerminalScreenClass
                                const char *url,
                                int flavor,
                                guint state);
+  gboolean (* match_copy)     (TerminalScreen *screen,
+                               const char *url,
+                               int flavor,
+                               guint state);
   void (* close_screen)       (TerminalScreen *screen);
 };
 
diff --git a/src/terminal-window.c b/src/terminal-window.c
index 2719708e..056a4c61 100644
--- a/src/terminal-window.c
+++ b/src/terminal-window.c
@@ -2223,6 +2223,26 @@ screen_match_clicked_cb (TerminalScreen *screen,
   return TRUE;
 }
 
+static gboolean
+screen_match_copy_cb (TerminalScreen *screen,
+                      const char *url,
+                      int url_flavor,
+                      guint state,
+                      TerminalWindow *window)
+{
+  TerminalWindowPrivate *priv = window->priv;
+  GtkClipboard *clipboard;
+
+  if (screen != priv->active_screen)
+    return FALSE;
+
+//  gtk_widget_grab_focus (GTK_WIDGET (screen));  // XXX ???
+  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_CLIPBOARD);
+  gtk_clipboard_set_text (clipboard, url, -1);
+
+  return TRUE;
+}
+
 static void
 screen_close_cb (TerminalScreen *screen,
                  TerminalWindow *window)
@@ -3546,6 +3566,8 @@ mdi_screen_added_cb (TerminalMdiContainer *container,
                     G_CALLBACK (screen_show_popup_menu_callback), window);
   g_signal_connect (screen, "match-clicked",
                     G_CALLBACK (screen_match_clicked_cb), window);
+  g_signal_connect (screen, "match-copy",
+                    G_CALLBACK (screen_match_copy_cb), window);
   g_signal_connect (screen, "resize-window",
                     G_CALLBACK (screen_resize_window_cb), window);
 
@@ -3636,6 +3658,9 @@ mdi_screen_removed_cb (TerminalMdiContainer *container,
                                         G_CALLBACK (screen_match_clicked_cb),
                                         window);
   g_signal_handlers_disconnect_by_func (screen,
+                                        G_CALLBACK (screen_match_copy_cb),
+                                        window);
+  g_signal_handlers_disconnect_by_func (screen,
                                         G_CALLBACK (screen_resize_window_cb),
                                         window);
 
