diff -ru screen-4.0.3-DIST/comm.c screen-4.0.3-dar/comm.c
--- screen-4.0.3-DIST/comm.c	2003-09-08 10:25:08.000000000 -0400
+++ screen-4.0.3-dar/comm.c	2008-08-27 01:04:14.000000000 -0400
@@ -105,6 +105,8 @@
 #ifdef COPY_PASTE
   { "bufferfile",	ARGS_01 },
 #endif
+  { "bumpleft",	ARGS_0 },
+  { "bumpright",	ARGS_0 },
   { "c1",		NEED_FORE|ARGS_01 },
   { "caption",		ARGS_12 },
 #ifdef MULTIUSER
@@ -113,6 +115,7 @@
   { "charset",          NEED_FORE|ARGS_1 },
   { "chdir",		ARGS_01 },
   { "clear",		NEED_FORE|ARGS_0 },
+  { "collapse",	ARGS_0 },
   { "colon",		NEED_LAYER|ARGS_01 },
   { "command",		NEED_DISPLAY|ARGS_02 },
 #ifdef COPY_PASTE
diff -ru screen-4.0.3-DIST/process.c screen-4.0.3-dar/process.c
--- screen-4.0.3-DIST/process.c	2003-09-18 08:53:54.000000000 -0400
+++ screen-4.0.3-dar/process.c	2008-08-27 09:29:04.000000000 -0400
@@ -110,6 +110,8 @@
 static int  NextWindow __P((void));
 static int  PreviousWindow __P((void));
 static int  MoreWindows __P((void));
+static void SwapWindows __P((int, int));
+static void CollapseWindowlist __P((void));
 static void LogToggle __P((int));
 static void ShowInfo __P((void));
 static void ShowDInfo __P((void));
@@ -538,6 +540,10 @@
   ktab['<'].nr = RC_READBUF;
   ktab['='].nr = RC_REMOVEBUF;
 #endif
+/* co-opting "^A [<>=]", looking for alternatives */
+  ktab['>'].nr = ktab[Ctrl('.')].nr = RC_BUMPRIGHT;
+  ktab['<'].nr = ktab[Ctrl(',')].nr = RC_BUMPLEFT;
+  ktab['='].nr = RC_COLLAPSE;
 #ifdef POW_DETACH
   ktab['D'].nr = RC_POW_DETACH;
 #endif
@@ -2753,46 +2759,24 @@
       if (msgok)
 	Msg(0, "silencewait set to %d seconds", SilenceWait);
       break;
+    case RC_BUMPRIGHT:
+      if (fore->w_number < NextWindow())
+	    SwapWindows(fore->w_number, NextWindow());
+      break;
+    case RC_BUMPLEFT:
+      if (fore->w_number > PreviousWindow())
+	    SwapWindows(fore->w_number, PreviousWindow());
+      break;
+    case RC_COLLAPSE:
+      CollapseWindowlist();
+      break;
     case RC_NUMBER:
       if (*args == 0)
         Msg(0, "This is window %d (%s).\n", fore->w_number, fore->w_title);
       else
-        {
-	  int old = fore->w_number;
-
-	  if (ParseNum(act, &n) || n >= maxwin)
-	    break;
-	  p = wtab[n];
-	  wtab[n] = fore;
-	  fore->w_number = n;
-	  wtab[old] = p;
-	  if (p)
-	    p->w_number = old;
-#ifdef MULTIUSER
-	  /* exchange the acls for these windows. */
-	  AclWinSwap(old, n);
-#endif
-#ifdef UTMPOK
-	  /* exchange the utmp-slots for these windows */
-	  if ((fore->w_slot != (slot_t) -1) && (fore->w_slot != (slot_t) 0))
-	    {
-	      RemoveUtmp(fore);
-	      SetUtmp(fore);
-	    }
-	  if (p && (p->w_slot != (slot_t) -1) && (p->w_slot != (slot_t) 0))
-	    {
-	      /* XXX: first display wins? */
-	      display = fore->w_layer.l_cvlist ? fore->w_layer.l_cvlist->c_display : 0;
-	      RemoveUtmp(p);
-	      SetUtmp(p);
-	    }
-#endif
-
-	  WindowChanged(fore, 'n');
-	  WindowChanged((struct win *)0, 'w');
-	  WindowChanged((struct win *)0, 'W');
-	  WindowChanged((struct win *)0, 0);
-	}
+	    if (ParseNum(act, &n) || n >= maxwin)
+          break;
+        SwapWindows(fore->w_number, n);
       break;
     case RC_SILENCE:
       n = fore->w_silence != 0;
@@ -3837,6 +3821,63 @@
 }
 
 void
+CollapseWindowlist()
+/* renumber windows from 0, leaving no gaps */
+{
+  int pos, moveto=0;
+
+  for (pos = 1; pos < MAXWIN; pos++)
+    if (wtab[pos])
+      for (; moveto < pos; moveto++)
+        if (!wtab[moveto])
+          {
+          SwapWindows(pos, moveto);
+          break;
+          }
+}
+
+void
+SwapWindows(old, dest)
+int old, dest;
+/* code from RC_NUMBER, modified to move windows other than fore */
+{
+  struct win *p, *win_old;
+
+  win_old = wtab[old];
+  p = wtab[dest];
+  wtab[dest] = win_old;
+  win_old->w_number = dest;
+  wtab[old] = p;
+  if (p)
+    p->w_number = old;
+#ifdef MULTIUSER
+  /* exchange the acls for these windows. */
+  AclWinSwap(old, dest);
+#endif
+#ifdef UTMPOK
+  /* exchange the utmp-slots for these windows */
+  if ((win_old->w_slot != (slot_t) -1) && (win_old->w_slot != (slot_t) 0))
+    {
+    RemoveUtmp(win_old);
+    SetUtmp(win_old);
+    }
+  if (p && (p->w_slot != (slot_t) -1) && (p->w_slot != (slot_t) 0))
+    {
+    /* XXX: first display wins? */
+    display = win_old->w_layer.l_cvlist ? win_old->w_layer.l_cvlist->c_display : 0;
+    RemoveUtmp(p);
+    SetUtmp(p);
+    }
+#endif
+
+  WindowChanged(win_old, 'n');
+  WindowChanged((struct win *)0, 'w');
+  WindowChanged((struct win *)0, 'W');
+  WindowChanged((struct win *)0, 0);
+  RedisplayDisplays(0);
+}
+
+void
 DoCommand(argv, argl) 
 char **argv;
 int *argl;
