diff -ur rxvt-unicode-9.02.orig/src/command.C rxvt-unicode-9.02/src/command.C
--- rxvt-unicode-9.02.orig/src/command.C	2008-01-29 02:56:48.000000000 -0800
+++ rxvt-unicode-9.02/src/command.C	2008-03-23 10:41:42.000000000 -0700
@@ -487,7 +487,7 @@
 
 #if ENABLE_FRILLS || ISO_14755
       // ISO 14755 support
-      if (shft && ctrl)
+      if (iso14755KeyMask && (ev.state & iso14755KeyMask) == iso14755KeyMask)
         {
           int hv;
 
@@ -527,8 +527,8 @@
               iso14755buf = 0;
             }
         }
-      else if ((ctrl && (keysym == XK_Shift_L || keysym == XK_Shift_R))
-               || (shft && (keysym == XK_Control_L || keysym == XK_Control_R)))
+      else if (iso14755KeyMask &&
+	       (ev.state | XkbKeysymToModifiers(dpy, keysym) & iso14755KeyMask) == iso14755KeyMask)
         if (!(iso14755buf & ISO_14755_STARTED))
           {
             iso14755buf |= ISO_14755_STARTED;
@@ -891,7 +891,7 @@
 # if ISO_14755
         // iso14755 part 5.2 handling: release time
         // first: controls
-        if ((ev.state & ControlMask)
+	if (((ev.state & iso14755KeyMask) != iso14755KeyMask)
              && ((keysym >= 0x40 && keysym <= 0x5f)
                  || (keysym >= 0x61 && keysym <= 0x7f)))
           {
@@ -916,7 +916,7 @@
 
         return;
       }
-    else if ((ev.state & (ShiftMask | ControlMask)) != (ShiftMask | ControlMask))
+    else if ((ev.state & iso14755KeyMask) != iso14755KeyMask)
       {
 # if ISO_14755
         scr_overlay_off ();
diff -ur rxvt-unicode-9.02.orig/src/init.C rxvt-unicode-9.02/src/init.C
--- rxvt-unicode-9.02.orig/src/init.C	2008-01-28 03:48:32.000000000 -0800
+++ rxvt-unicode-9.02/src/init.C	2008-03-23 10:41:42.000000000 -0700
@@ -337,6 +337,7 @@
 {
   int i, r_argc;
   const char **cmd_argv, **r_argv;
+  char *val;
 
   /*
    * Look for -e option. Find => split and make cmd_argv[] of command args
@@ -457,6 +458,45 @@
     pointerBlankDelay = 2;
 #endif
 
+#ifdef ISO_14755
+  if (rs[Rs_iso14755KeyMask]) {
+    iso14755KeyMask = 0;
+    i=0;
+    val=(char*)rs[Rs_iso14755KeyMask];
+    while(val) {
+      if(!strncasecmp(val, "shift", 5)) {
+        iso14755KeyMask |= ShiftMask;
+      } else if(!strncasecmp(val, "ctrl", 4)) {
+	 iso14755KeyMask |= ControlMask;
+      } else if(!strncasecmp(val, "control", 7)) {
+	 iso14755KeyMask |= ControlMask;
+      } else if(!strncasecmp(val, "alt", 3)) {
+	 iso14755KeyMask |= XkbKeysymToModifiers(dpy, XK_Alt_L);
+      } else if(!strncasecmp(val, "meta", 4)) {
+	 iso14755KeyMask |= XkbKeysymToModifiers(dpy, XK_Meta_L);
+      } else if(!strncasecmp(val, "hyper", 5)) {
+	 iso14755KeyMask |= XkbKeysymToModifiers(dpy, XK_Hyper_L);
+      } else if(!strncasecmp(val, "super", 5)) {
+	 iso14755KeyMask |= XkbKeysymToModifiers(dpy, XK_Super_L);
+      } else if(!strncasecmp(val, "mod", 3)) {
+        switch(val[3]) {
+          case '1': iso14755KeyMask |= Mod1Mask; break;
+          case '2': iso14755KeyMask |= Mod2Mask; break;
+          case '3': iso14755KeyMask |= Mod3Mask; break;
+          case '4': iso14755KeyMask |= Mod4Mask; break;
+          case '5': iso14755KeyMask |= Mod5Mask; break;
+          default: rxvt_warn("trouble parsing iso14755KeyMask starting at '%s'\n", val);
+        }
+      } else if(strncasecmp(val, "none", 4)) {
+          rxvt_warn("trouble parsing iso14755KeyMask starting at '%s'\n", val);
+      }
+      val=strchr(val, '&');
+      if(val) val++;
+    }
+  } else
+    iso14755KeyMask = ShiftMask | ControlMask;
+#endif
+
   /* no point having a scrollbar without having any scrollback! */
   if (!saveLines)
     set_option (Opt_scrollBar, 0);
diff -ur rxvt-unicode-9.02.orig/src/rsinc.h rxvt-unicode-9.02/src/rsinc.h
--- rxvt-unicode-9.02.orig/src/rsinc.h	2008-01-28 03:48:32.000000000 -0800
+++ rxvt-unicode-9.02/src/rsinc.h	2008-03-23 10:41:42.000000000 -0700
@@ -111,6 +111,7 @@
 #endif
 #if ISO_14755
   def (iso14755_52)
+  def (iso14755KeyMask)
 #endif
 #ifdef HAVE_AFTERIMAGE
   def (blendtype)
diff -ur rxvt-unicode-9.02.orig/src/rxvt.h rxvt-unicode-9.02/src/rxvt.h
--- rxvt-unicode-9.02.orig/src/rxvt.h	2008-01-28 03:48:32.000000000 -0800
+++ rxvt-unicode-9.02/src/rxvt.h	2008-03-23 10:41:42.000000000 -0700
@@ -73,6 +73,7 @@
 #include <X11/keysym.h>
 #include <X11/keysymdef.h>
 #include <X11/Xatom.h>
+#include <X11/XKBlib.h>
 
 #include "encoding.h"
 #include "rxvtutil.h"
@@ -1008,6 +1009,9 @@
                   pointerBlankDelay,
 # endif
                   allowedxerror;
+# if ENABLE_FRILLS || ISO_14755
+  unsigned int    iso14755KeyMask;
+# endif
 /* ---------- */
   unsigned int    ModLevel3Mask,
                   ModMetaMask,
diff -ur rxvt-unicode-9.02.orig/src/xdefaults.C rxvt-unicode-9.02/src/xdefaults.C
--- rxvt-unicode-9.02.orig/src/xdefaults.C	2008-01-28 03:48:32.000000000 -0800
+++ rxvt-unicode-9.02/src/xdefaults.C	2008-03-23 10:41:42.000000000 -0700
@@ -261,6 +261,7 @@
 #endif
 #if ISO_14755
               BOOL (Rs_iso14755_52, "iso14755_52", NULL, Opt_iso14755_52, 0, NULL),
+              RSTRG (Rs_iso14755KeyMask, "iso14755KeyMask", "shift mask"),
 #endif
 #ifdef HAVE_AFTERIMAGE
               STRG (Rs_blendtype, "blendType", "blt", "string", "background image blending type - alpha, tint, etc..."),
