diff --git a/src/terminal-screen.c b/src/terminal-screen.c
index 63f0ca2..effc6a7 100644
--- a/src/terminal-screen.c
+++ b/src/terminal-screen.c
@@ -158,6 +158,8 @@ static void terminal_screen_check_extra (TerminalScreen *screen,
 static char* terminal_screen_check_match       (TerminalScreen            *screen,
                                                 GdkEvent                  *event,
                                                 int                  *flavor);
+static char* terminal_screen_check_hyperlink   (TerminalScreen            *screen,
+                                                GdkEvent                  *event);
 
 static void terminal_screen_set_override_command (TerminalScreen  *screen,
                                                   char           **argv,
@@ -1510,6 +1512,7 @@ terminal_screen_popup_info_unref (TerminalScreenPopupInfo *info)
   g_object_unref (info->screen);
   g_weak_ref_clear (&info->window_weak_ref);
   g_free (info->url);
+  g_free (info->hyperlink);
   g_free (info->number_info);
   g_slice_free (TerminalScreenPopupInfo, info);
 }
@@ -1549,6 +1552,7 @@ terminal_screen_do_popup (TerminalScreen *screen,
                           GdkEventButton *event,
                           char *url,
                           int url_flavor,
+                          char *hyperlink,
                           char *number_info)
 {
   TerminalScreenPopupInfo *info;
@@ -1559,6 +1563,7 @@ terminal_screen_do_popup (TerminalScreen *screen,
   info->timestamp = event->time;
   info->url = url; /* adopted */
   info->url_flavor = url_flavor;
+  info->hyperlink = hyperlink;
   info->number_info = number_info; /* adopted */
 
   g_signal_emit (screen, signals[SHOW_POPUP_MENU], 0, info);
@@ -1573,6 +1578,7 @@ terminal_screen_button_press (GtkWidget      *widget,
   gboolean (* button_press_event) (GtkWidget*, GdkEventButton*) =
     GTK_WIDGET_CLASS (terminal_screen_parent_class)->button_press_event;
   gs_free char *url = NULL;
+  gs_free char *hyperlink = NULL;
   int url_flavor = 0;
   gs_free char *number_info = NULL;
   guint state;
@@ -1580,8 +1586,24 @@ terminal_screen_button_press (GtkWidget      *widget,
   state = event->state & gtk_accelerator_get_default_mod_mask ();
 
   url = terminal_screen_check_match (screen, (GdkEvent*)event, &url_flavor);
+  hyperlink = terminal_screen_check_hyperlink (screen, (GdkEvent*)event);
   terminal_screen_check_extra (screen, (GdkEvent*)event, &number_info);
 
+  if (hyperlink != NULL &&
+      (event->button == 1 || event->button == 2) &&
+      (state & GDK_CONTROL_MASK))
+    {
+      gboolean handled = FALSE;
+
+      g_signal_emit (screen, signals[MATCH_CLICKED], 0,
+                     hyperlink,
+                     FLAVOR_AS_IS,
+                     state,
+                     &handled);
+      if (handled)
+        return TRUE; /* don't do anything else such as select with the click */
+    }
+
   if (url != NULL &&
       (event->button == 1 || event->button == 2) &&
       (state & GDK_CONTROL_MASK))
@@ -1606,16 +1628,18 @@ terminal_screen_button_press (GtkWidget      *widget,
           if (button_press_event && button_press_event (widget, event))
             return TRUE;
 
-          terminal_screen_do_popup (screen, event, url, url_flavor, number_info);
+          terminal_screen_do_popup (screen, event, url, url_flavor, hyperlink, number_info);
           url = NULL; /* adopted to the popup info */
+          hyperlink = NULL;
           number_info = NULL; /* detto */
           return TRUE;
         }
       else if (!(event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)))
         {
           /* do popup on shift+right-click */
-          terminal_screen_do_popup (screen, event, url, url_flavor, number_info);
+          terminal_screen_do_popup (screen, event, url, url_flavor, hyperlink, number_info);
           url = NULL; /* adopted to the popup info */
+          hyperlink = NULL;
           number_info = NULL; /* detto */
           return TRUE;
         }
@@ -1979,6 +2003,15 @@ terminal_screen_check_match (TerminalScreen *screen,
   return NULL;
 }
 
+static char*
+terminal_screen_check_hyperlink (TerminalScreen *screen,
+                                 GdkEvent       *event)
+{
+  TerminalScreenPrivate *priv = screen->priv;
+
+  return vte_terminal_get_hyperlink (VTE_TERMINAL (screen), event);
+}
+
 static void
 terminal_screen_check_extra (TerminalScreen *screen,
                              GdkEvent       *event,
diff --git a/src/terminal-screen.h b/src/terminal-screen.h
index f3b4013..2e8f6dc 100644
--- a/src/terminal-screen.h
+++ b/src/terminal-screen.h
@@ -142,6 +142,7 @@ struct _TerminalScreenPopupInfo {
   TerminalScreen *screen;
   char *url;
   TerminalURLFlavor url_flavor;
+  char *hyperlink;
   char *number_info;
   guint button;
   guint state;
diff --git a/src/terminal-window.c b/src/terminal-window.c
index 2921c02..9b40374 100644
--- a/src/terminal-window.c
+++ b/src/terminal-window.c
@@ -1983,6 +1983,38 @@ popup_copy_url_callback (GtkAction *action,
 }
 
 static void
+popup_open_hyperlink_callback (GtkAction *action,
+                               TerminalWindow *window)
+{
+  TerminalWindowPrivate *priv = window->priv;
+  TerminalScreenPopupInfo *info = priv->popup_info;
+
+  if (info == NULL)
+    return;
+
+  terminal_util_open_url (GTK_WIDGET (window), info->hyperlink, FLAVOR_AS_IS,
+                          gtk_get_current_event_time ());
+}
+
+static void
+popup_copy_hyperlink_callback (GtkAction *action,
+                               TerminalWindow *window)
+{
+  TerminalWindowPrivate *priv = window->priv;
+  TerminalScreenPopupInfo *info = priv->popup_info;
+  GtkClipboard *clipboard;
+
+  if (info == NULL)
+    return;
+
+  if (info->hyperlink == NULL)
+    return;
+
+  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_CLIPBOARD);
+  gtk_clipboard_set_text (clipboard, info->hyperlink, -1);
+}
+
+static void
 popup_leave_fullscreen_callback (GtkAction *action,
                                  TerminalWindow *window)
 {
@@ -2054,7 +2086,7 @@ popup_clipboard_targets_received_cb (GtkClipboard *clipboard,
   TerminalScreen *screen = info->screen;
   GtkWidget *popup_menu;
   GtkAction *action;
-  gboolean can_paste, can_paste_uris, show_link, show_email_link, show_call_link, show_number_info;
+  gboolean can_paste, can_paste_uris, show_link, show_email_link, show_call_link, show_hyperlink, show_number_info;
 
   window = terminal_screen_popup_info_ref_window (info);
   if (window == NULL ||
@@ -2075,6 +2107,7 @@ popup_clipboard_targets_received_cb (GtkClipboard *clipboard,
   show_link = info->url != NULL && (info->url_flavor == FLAVOR_AS_IS || info->url_flavor == FLAVOR_DEFAULT_TO_HTTP);
   show_email_link = info->url != NULL && info->url_flavor == FLAVOR_EMAIL;
   show_call_link = info->url != NULL && info->url_flavor == FLAVOR_VOIP_CALL;
+  show_hyperlink = info->hyperlink != NULL;
   show_number_info = info->number_info != NULL;
 
   action = gtk_action_group_get_action (priv->action_group, "PopupSendEmail");
@@ -2089,6 +2122,16 @@ popup_clipboard_targets_received_cb (GtkClipboard *clipboard,
   gtk_action_set_visible (action, show_link);
   action = gtk_action_group_get_action (priv->action_group, "PopupCopyLinkAddress");
   gtk_action_set_visible (action, show_link);
+
+  action = gtk_action_group_get_action (priv->action_group, "PopupOpenHyperlink");
+  gtk_action_set_visible (action, show_hyperlink);
+  action = gtk_action_group_get_action (priv->action_group, "PopupCopyHyperlinkAddress");
+  gtk_action_set_visible (action, show_hyperlink);
+  action = gtk_action_group_get_action (priv->action_group, "PopupHyperlinkInfo");
+  gtk_action_set_label (action, info->hyperlink);
+  gtk_action_set_sensitive (action, FALSE);
+  gtk_action_set_visible (action, show_hyperlink);
+
   action = gtk_action_group_get_action (priv->action_group, "PopupNumberInfo");
   gtk_action_set_label (action, info->number_info);
   gtk_action_set_sensitive (action, FALSE);
@@ -2580,6 +2623,15 @@ terminal_window_init (TerminalWindow *window)
       { "PopupCopyLinkAddress", NULL, N_("_Copy Link Address"), NULL,
         NULL,
         G_CALLBACK (popup_copy_url_callback) },
+      { "PopupOpenHyperlink", NULL, N_("_Open OSC 8 Hyperlink"), NULL,
+        NULL,
+        G_CALLBACK (popup_open_hyperlink_callback) },
+      { "PopupCopyHyperlinkAddress", NULL, N_("_Copy OSC 8 Hyperlink Address"), NULL,
+        NULL,
+        G_CALLBACK (popup_copy_hyperlink_callback) },
+      { "PopupHyperlinkInfo", NULL, "", NULL,
+        NULL,
+        NULL },
       { "PopupNumberInfo", NULL, "", NULL,
         NULL,
         NULL },
diff --git a/src/terminal.xml b/src/terminal.xml
index d830149..76f7b77 100644
--- a/src/terminal.xml
+++ b/src/terminal.xml
@@ -78,6 +78,10 @@
   </menubar>
 
   <popup name="Popup" action="Popup">
+    <menuitem action="PopupHyperlinkInfo" />
+    <menuitem action="PopupOpenHyperlink" />
+    <menuitem action="PopupCopyHyperlinkAddress" />
+    <separator />
     <menuitem action="PopupSendEmail" />
     <menuitem action="PopupCopyEmailAddress" />
     <menuitem action="PopupCall" />
