--- a/src/plugin.c
+++ b/src/plugin.c
@@ -47,6 +47,7 @@
 #include <X11/X.h>
 #include <X11/Xlib.h>
 #include <X11/keysym.h>
+#include <X11/cursorfont.h>
 
 #include <xine.h>
 #include <xine/xineutils.h>
@@ -88,6 +89,7 @@
   int                 screen;
   Window              parent;
   Window              window;
+  Cursor              pointer;
   int                 x, y;
   int                 w, h;
 
@@ -101,6 +103,7 @@
   char                base[1024];
 
   char               *override_mrl;
+  char               *href;
 
   playlist_entry_t   *list;
   playlist_entry_t   *track;
@@ -505,6 +508,17 @@
               osd_show_text (this, buf);
             } 
             break;
+          case XK_l:
+          case XK_L:
+            if (this->href)
+            {
+              printf ("Launching %s%s\n", this->href,
+                      (evt.xkey.state & ControlMask) ? " (new)" : "");
+              NPN_GetURL (this->instance, this->href,
+                          (evt.xkey.state & ControlMask) ? "_new" : "_self");
+            }
+            break;
+
           default:
             break;
         }
@@ -514,6 +528,16 @@
           xine_input_data_t input;
           x11_rectangle_t   rect;
           
+          if ((evt.xbutton.button & ~1) == 2) {
+            if (this->href) {
+              printf ("Launching %s%s\n", this->href,
+                      (evt.xbutton.button == 2) ? " (new)" : "");
+              NPN_GetURL (this->instance, this->href,
+                          (evt.xbutton.button == 2) ? "_new" : "_self");
+            }
+            break;
+          }
+
           rect.x = evt.xbutton.x;
           rect.y = evt.xbutton.y;
           rect.w = 0;
@@ -1369,6 +1393,7 @@
   xine_plugin_t       *this;
   pthread_mutexattr_t  attr;
   char                *mrl = NULL;
+  char                *href = NULL;
   int                  loop = 1;
   int                  start = 0;
   int                  autostart = 1;
@@ -1426,7 +1451,6 @@
         mrl = argv[i];
     }
     else if (!strcasecmp (argn[i], "url")   ||
-             !strcasecmp (argn[i], "href")  ||
              !strcasecmp (argn[i], "qtsrc") ||
              !strcasecmp (argn[i], "filename")) {
       /* Override. */
@@ -1435,6 +1459,10 @@
         geturl = 1;
       }
     }
+    else if (!strcasecmp (argn[i], "href")) {
+      if (!href && *argv[i])
+        href = argv[i];
+    }
   }
 
   this = NPN_MemAlloc (sizeof(xine_plugin_t));
@@ -1450,6 +1478,7 @@
 
   this->xine = xine_create ();
   if (!this->xine) {
+    NPN_MemFree (this->href);
     NPN_MemFree (this);
     return NPERR_GENERIC_ERROR;
   }
@@ -1495,7 +1524,12 @@
       }
     }
   }
-  
+
+  if (href) {
+    this->href = NPN_MemAlloc (strlen (href) + 1);
+    strcpy (this->href, href);
+  }
+ 
   return NPERR_NO_ERROR;
 }
 
@@ -1520,7 +1554,10 @@
       XLockDisplay (this->display);
       XUnmapWindow (this->display, this->window);
       XDestroyWindow (this->display, this->window);
+      if (this->pointer)
+       XFreeCursor (this->display, this->pointer);
       XUnlockDisplay (this->display);
+      this->pointer = 0;
       this->window = 0;
       this->parent = 0;
       
@@ -1561,6 +1598,11 @@
       this->w = window->width;
       this->h = window->height;
 
+      if (!this->pointer && this->href) {
+        this->pointer = XCreateFontCursor (this->display, XC_hand2);
+        XDefineCursor (this->display, this->window, this->pointer);
+      }
+
       XUnlockDisplay (this->display);
 
       pthread_mutex_unlock (&this->mutex);