diff --git a/src/terminal-screen.c b/src/terminal-screen.c
index d60ba09..c915dc4 100644
--- a/src/terminal-screen.c
+++ b/src/terminal-screen.c
@@ -67,8 +67,7 @@ struct _TerminalScreenPrivate
   double font_scale;
   guint recheck_working_dir_idle;
   gboolean user_title; /* title was manually set */
-  GSList *url_tags;
-  GSList *skey_tags;
+  GSList *match_tags;
 };
 
 enum
@@ -118,6 +117,8 @@ static void terminal_screen_change_font (TerminalScreen *screen);
 static gboolean terminal_screen_popup_menu (GtkWidget *widget);
 static gboolean terminal_screen_button_press (GtkWidget *widget,
                                               GdkEventButton *event);
+static gboolean terminal_screen_button_release (GtkWidget *widget,
+                                                GdkEventButton *event);
 
 static void terminal_screen_window_title_changed      (VteTerminal *vte_terminal,
                                                        TerminalScreen *screen);
@@ -140,18 +141,11 @@ static void queue_recheck_working_dir (TerminalScreen *screen);
 static void  terminal_screen_match_add         (TerminalScreen            *screen,
                                                 const char           *regexp,
                                                 int                   flavor);
-static void  terminal_screen_skey_match_add    (TerminalScreen            *screen,
-                                                const char           *regexp,
-                                                int                   flavor);
 #endif /* VTE < 0.6.15 */
 static char* terminal_screen_check_match       (TerminalScreen            *screen,
                                                 int                   column,
                                                 int                   row,
                                                 int                  *flavor);
-static char* terminal_screen_skey_check_match  (TerminalScreen            *screen,
-                                                int                   column,
-                                                int                   row,
-                                                int                  *flavor);
 static void  terminal_screen_skey_match_remove (TerminalScreen            *screen);
 
 static guint signals[LAST_SIGNAL];
@@ -407,7 +401,7 @@ terminal_screen_init (TerminalScreen *screen)
       tag_data->tag = vte_terminal_match_add_gregex (terminal, url_regexes[i], 0);
       vte_terminal_match_set_cursor_type (terminal, tag_data->tag, URL_MATCH_CURSOR);
 
-      priv->url_tags = g_slist_prepend (priv->url_tags, tag_data);
+      priv->match_tags = g_slist_prepend (priv->match_tags, tag_data);
     }
 #else /* VTE < 0.6.15 */
   
@@ -569,6 +563,7 @@ terminal_screen_class_init (TerminalScreenClass *klass)
   widget_class->style_set = terminal_screen_style_set;
   widget_class->drag_data_received = terminal_screen_drag_data_received;
   widget_class->button_press_event = terminal_screen_button_press;
+  widget_class->button_release_event = terminal_screen_button_release;
   widget_class->popup_menu = terminal_screen_popup_menu;
 
   signals[PROFILE_SET] =
@@ -738,11 +733,8 @@ terminal_screen_finalize (GObject *object)
   g_strfreev (priv->override_command);
   g_free (priv->working_dir);
 
-  g_slist_foreach (priv->url_tags, (GFunc) free_tag_data, NULL);
-  g_slist_free (priv->url_tags);
-
-  g_slist_foreach (priv->skey_tags, (GFunc) free_tag_data, NULL);
-  g_slist_free (priv->skey_tags);
+  g_slist_foreach (priv->match_tags, (GFunc) free_tag_data, NULL);
+  g_slist_free (priv->match_tags);
 
   G_OBJECT_CLASS (terminal_screen_parent_class)->finalize (object);
 }
@@ -879,20 +871,20 @@ terminal_screen_profile_notify_cb (TerminalProfile *profile,
               TagData *tag_data;
 
               tag_data = g_slice_new (TagData);
-              tag_data->flavor = FLAVOR_AS_IS;
+              tag_data->flavor = FLAVOR_SKEY;
               tag_data->tag = vte_terminal_match_add_gregex (vte_terminal, skey_regexes[i], 0);
               vte_terminal_match_set_cursor_type (vte_terminal, tag_data->tag, SKEY_MATCH_CURSOR);
 
-              priv->skey_tags = g_slist_prepend (priv->skey_tags, tag_data);
+              priv->match_tags = g_slist_prepend (priv->match_tags, tag_data);
             }
 #else /* VTE < 0.6.15 */
-          terminal_screen_skey_match_add (screen,
-                                          "s/key [0-9]* [-A-Za-z0-9]*",
-                                          FLAVOR_AS_IS);
+          terminal_screen_match_add (screen,
+                                     "s/key [0-9]* [-A-Za-z0-9]*",
+                                     FLAVOR_SKEY);
 
-          terminal_screen_skey_match_add (screen,
-                                          "otp-[a-z0-9]* [0-9]* [-A-Za-z0-9]*",
-                                          FLAVOR_AS_IS);
+          terminal_screen_match_add (screen,
+                                     "otp-[a-z0-9]* [0-9]* [-A-Za-z0-9]*",
+                                     FLAVOR_SKEY);
 #endif /* VTE 0.6.15 */
         }
       else
@@ -1622,60 +1614,25 @@ terminal_screen_button_press (GtkWidget      *widget,
                               GdkEventButton *event)
 {
   TerminalScreen *screen = TERMINAL_SCREEN (widget);
-  TerminalScreenPrivate *priv = screen->priv;
-  int char_width, char_height;
-  gboolean dingus_button;
-  char *matched_string;
-  int matched_flavor = 0;
+  gboolean (* button_press_event) (GtkWidget*, GdkEventButton*) =
+    GTK_WIDGET_CLASS (terminal_screen_parent_class)->button_press_event;
   guint state;
 
   state = event->state & gtk_accelerator_get_default_mod_mask ();
 
-  terminal_screen_get_cell_size (screen, &char_width, &char_height);
-
-  matched_string =
-    terminal_screen_check_match (screen,
-                                 event->x / char_width,
-                                 event->y / char_height,
-                                 &matched_flavor);
-  dingus_button = ((event->button == 1) || (event->button == 2));
-
-  if (dingus_button &&
-      (state & GDK_CONTROL_MASK) &&
-      terminal_profile_get_property_boolean (priv->profile, TERMINAL_PROFILE_USE_SKEY))
-    {
-      char *skey_match;
-
-      skey_match = terminal_screen_skey_check_match (screen,
-						     event->x / char_width,
-						     event->y / char_height,
-                                                     NULL);
-      if (skey_match != NULL)
-	{
-          g_signal_emit (screen, signals[SKEY_CLICKED], 0, skey_match);
-	  g_free (skey_match);
-          g_free (matched_string);
-
-	  return TRUE;
-	}
-    }
-
-  if (dingus_button &&
-      (state & GDK_CONTROL_MASK) != 0 &&
-      matched_string != NULL)
-    {
-      gtk_widget_grab_focus (widget);
-
-      g_signal_emit (screen, signals[URL_CLICKED], 0, matched_string, matched_flavor);
-      g_free (matched_string);
-
-      return TRUE; /* don't do anything else such as select with the click */
-    }
-      
   if (event->button == 3 &&
       (state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)) == 0)
     {
       TerminalScreenPopupInfo *info;
+      char *matched_string;
+      int matched_flavor = 0;
+      int char_width, char_height;
+
+      terminal_screen_get_cell_size (screen, &char_width, &char_height);
+      matched_string = terminal_screen_check_match (screen,
+                                                    event->x / char_width,
+                                                    event->y / char_height,
+                                                    &matched_flavor);
 
       info = terminal_screen_popup_info_new (screen);
       info->button = event->button;
@@ -1689,13 +1646,71 @@ terminal_screen_button_press (GtkWidget      *widget,
       return TRUE;
     }
 
-  /* default behavior is to let the terminal widget deal with it */
-  if (GTK_WIDGET_CLASS (terminal_screen_parent_class)->button_press_event)
-    return GTK_WIDGET_CLASS (terminal_screen_parent_class)->button_press_event (widget, event);
+  if (button_press_event)
+    return button_press_event (widget, event);
 
   return FALSE;
 }
 
+static gboolean
+terminal_screen_button_release (GtkWidget      *widget,
+                                GdkEventButton *event)
+{
+  TerminalScreen *screen = TERMINAL_SCREEN (widget);
+  TerminalScreenPrivate *priv = screen->priv;
+  int char_width, char_height;
+  char *matched_string;
+  int matched_flavor = 0;
+  guint state;
+  gboolean (* button_release_event) (GtkWidget*, GdkEventButton*) =
+    GTK_WIDGET_CLASS (terminal_screen_parent_class)->button_release_event;
+
+  g_print ("button release 1\n");
+  /* default behavior is to let the terminal widget deal with it */
+  if (button_release_event &&
+      button_release_event (widget, event)) ;
+   return TRUE;
+
+  g_print ("button release 2\n");
+  if (event->button != 1 &&
+      event->button != 2)
+    return FALSE;
+
+  g_print ("button release 3\n");
+  state = event->state & gtk_accelerator_get_default_mod_mask ();
+  if (state != 0)
+    return FALSE;
+
+  terminal_screen_get_cell_size (screen, &char_width, &char_height);
+
+  matched_string = terminal_screen_check_match (screen,
+                                                event->x / char_width,
+                                                event->y / char_height,
+                                                &matched_flavor);
+  g_print ("button release 4: string '%s' flavor %d\n", matched_string, matched_flavor);
+  if (!matched_string)
+    return FALSE;
+
+  if (matched_flavor == FLAVOR_SKEY)
+    {
+      gboolean enabled;
+
+      enabled = terminal_profile_get_property_boolean (priv->profile, TERMINAL_PROFILE_USE_SKEY);
+      if (enabled)
+        g_signal_emit (screen, signals[SKEY_CLICKED], 0, matched_string);
+          
+      g_free (matched_string);
+      return enabled;
+    }
+
+  gtk_widget_grab_focus (widget);
+
+  g_signal_emit (screen, signals[URL_CLICKED], 0, matched_string, matched_flavor);
+  g_free (matched_string);
+
+  return TRUE;
+}
+
 void
 terminal_screen_set_dynamic_title (TerminalScreen *screen,
                                    const char     *title,
@@ -2237,7 +2252,7 @@ terminal_screen_get_cell_size (TerminalScreen *screen,
 #if !VTE_CHECK_VERSION (0, 16, 15)
 
 static void
-terminal_screen_match_add (TerminalScreen            *screen,
+terminal_screen_match_add (TerminalScreen       *screen,
                            const char           *regexp,
                            int                   flavor)
 {
@@ -2253,27 +2268,7 @@ terminal_screen_match_add (TerminalScreen            *screen,
   tag_data->tag = tag;
   tag_data->flavor = flavor;
 
-  priv->url_tags = g_slist_append (priv->url_tags, tag_data);
-}
-
-static void
-terminal_screen_skey_match_add (TerminalScreen *screen,
-                                const char *regexp,
-                                int flavor)
-{
-  TerminalScreenPrivate *priv = screen->priv;
-  VteTerminal *terminal = VTE_TERMINAL (screen);
-  TagData *tag_data;
-  int tag;
-  
-  tag = vte_terminal_match_add (terminal, regexp);
-  vte_terminal_match_set_cursor_type (terminal, tag, SKEY_MATCH_CURSOR);
-
-  tag_data = g_slice_new (TagData);
-  tag_data->tag = tag;
-  tag_data->flavor = flavor;
-
-  priv->skey_tags = g_slist_append (priv->skey_tags, tag_data);
+  priv->match_tags = g_slist_append (priv->match_tags, tag_data);
 }
 
 #endif /* VTE 0.6.15 */
@@ -2282,15 +2277,22 @@ static void
 terminal_screen_skey_match_remove (TerminalScreen *screen)
 {
   TerminalScreenPrivate *priv = screen->priv;
-  GSList *tags;
-  
-  for (tags = priv->skey_tags; tags != NULL; tags = tags->next)
-    vte_terminal_match_remove (VTE_TERMINAL (screen),
-                               GPOINTER_TO_INT(((TagData*)tags->data)->tag));
+  GSList *l, *next;
+
+  l = priv->match_tags;
+  while (l != NULL)
+    {
+      TagData *tag_data = (TagData *) l->data;
 
-  g_slist_foreach (priv->skey_tags, (GFunc) free_tag_data, NULL);
-  g_slist_free (priv->skey_tags);
-  priv->skey_tags = NULL;
+      next = l->next;
+      if (tag_data->flavor == FLAVOR_SKEY)
+        {
+          vte_terminal_match_remove (VTE_TERMINAL (screen), tag_data->tag);
+          priv->match_tags = g_slist_delete_link (priv->match_tags, l);
+        }
+
+      l = next;
+    }
 }
 
 static char*
@@ -2301,41 +2303,14 @@ terminal_screen_check_match (TerminalScreen *screen,
 {
   TerminalScreenPrivate *priv = screen->priv;
   GSList *tags;
-  gint tag;
-  char *match;
-
-  match = vte_terminal_match_check (VTE_TERMINAL (screen), column, row, &tag);
-  for (tags = priv->url_tags; tags != NULL; tags = tags->next)
-    {
-      TagData *tag_data = (TagData*) tags->data;
-      if (GPOINTER_TO_INT(tag_data->tag) == tag)
-	{
-	  if (flavor)
-	    *flavor = tag_data->flavor;
-	  return match;
-	}
-    }
-
-  g_free (match);
-  return NULL;
-}
-
-static char*
-terminal_screen_skey_check_match (TerminalScreen *screen,
-				  int        column,
-				  int        row,
-                                  int       *flavor)
-{
-  TerminalScreenPrivate *priv = screen->priv;
-  GSList *tags;
-  gint tag;
+  int tag;
   char *match;
 
   match = vte_terminal_match_check (VTE_TERMINAL (screen), column, row, &tag);
-  for (tags = priv->skey_tags; tags != NULL; tags = tags->next)
+  for (tags = priv->match_tags; tags != NULL; tags = tags->next)
     {
       TagData *tag_data = (TagData*) tags->data;
-      if (GPOINTER_TO_INT(tag_data->tag) == tag)
+      if (tag_data->tag == tag)
 	{
 	  if (flavor)
 	    *flavor = tag_data->flavor;
diff --git a/src/terminal-screen.h b/src/terminal-screen.h
index 3580c7e..6d0ebb2 100644
--- a/src/terminal-screen.h
+++ b/src/terminal-screen.h
@@ -36,7 +36,8 @@ typedef enum {
   FLAVOR_AS_IS,
   FLAVOR_DEFAULT_TO_HTTP,
   FLAVOR_VOIP_CALL,
-  FLAVOR_EMAIL
+  FLAVOR_EMAIL,
+  FLAVOR_SKEY
 } TerminalURLFlavour;
 
 /* Forward decls */
diff --git a/src/terminal-window.c b/src/terminal-window.c
index f2bb21e..041631f 100644
--- a/src/terminal-window.c
+++ b/src/terminal-window.c
@@ -999,7 +999,7 @@ popup_clipboard_targets_received_cb (GtkClipboard *clipboard,
 
   can_paste = targets != NULL && gtk_targets_include_text (targets, n_targets);
   can_paste_uris = targets != NULL && gtk_targets_include_uri (targets, n_targets);
-  show_link = info->string != NULL && info->flavour != FLAVOR_EMAIL && info->flavour != FLAVOR_VOIP_CALL;
+  show_link = info->string != NULL && (info->flavour == FLAVOR_AS_IS || info->flavour == FLAVOR_DEFAULT_TO_HTTP);
   show_email_link = info->string != NULL && info->flavour == FLAVOR_EMAIL;
   show_call_link = info->string != NULL && info->flavour == FLAVOR_VOIP_CALL;
 
