Index: src/include/all-keybindings.h
===================================================================
--- src/include/all-keybindings.h	(revision 4074)
+++ src/include/all-keybindings.h	(working copy)
@@ -158,6 +158,12 @@
 keybind (switch_windows_backward,  handle_switch,        META_TAB_LIST_NORMAL,
          REVERSES_AND_REVERSED,  NULL,
         _("Move backward between windows, using a popup window"))
+keybind (switch_windows_all,        handle_switch,       META_TAB_LIST_NORMAL_ALL_WORKSPACES,
+         BINDING_REVERSES,       NULL,
+        _("Move between windows on all workspaces, using a popup window"))
+keybind (switch_windows_all_backward,handle_switch,      META_TAB_LIST_NORMAL_ALL_WORKSPACES,
+         REVERSES_AND_REVERSED,  NULL,
+        _("Move backward between windows on all workspaces, using a popup window"))
 keybind (switch_panels,             handle_switch,        META_TAB_LIST_DOCKS,
          BINDING_REVERSES,       "<Control><Alt>Tab",
         _("Move between panels and the desktop, using a popup window"))
Index: src/include/common.h
===================================================================
--- src/include/common.h	(revision 4074)
+++ src/include/common.h	(working copy)
@@ -115,9 +115,11 @@
   /* Alt+Tab */
   META_GRAB_OP_KEYBOARD_TABBING_NORMAL,
   META_GRAB_OP_KEYBOARD_TABBING_DOCK,
+  META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES,
 
   /* Alt+Esc */
   META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL,
+  META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES,
   META_GRAB_OP_KEYBOARD_ESCAPING_DOCK,
 
   META_GRAB_OP_KEYBOARD_ESCAPING_GROUP,
Index: src/core/display.c
===================================================================
--- src/core/display.c	(revision 4074)
+++ src/core/display.c	(working copy)
@@ -82,7 +82,9 @@
         (g == META_GRAB_OP_KEYBOARD_TABBING_NORMAL  ||  \
          g == META_GRAB_OP_KEYBOARD_TABBING_DOCK    ||  \
          g == META_GRAB_OP_KEYBOARD_TABBING_GROUP   ||  \
+         g == META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES ||  \
          g == META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL ||  \
+         g == META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES ||  \
          g == META_GRAB_OP_KEYBOARD_ESCAPING_DOCK   ||  \
          g == META_GRAB_OP_KEYBOARD_ESCAPING_GROUP)
 
@@ -1131,9 +1133,11 @@
     case META_GRAB_OP_KEYBOARD_RESIZING_SW:
     case META_GRAB_OP_KEYBOARD_RESIZING_NW:
     case META_GRAB_OP_KEYBOARD_TABBING_NORMAL:
+    case META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES:
     case META_GRAB_OP_KEYBOARD_TABBING_DOCK:
     case META_GRAB_OP_KEYBOARD_TABBING_GROUP:
     case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL:
+    case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES:
     case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK:
     case META_GRAB_OP_KEYBOARD_ESCAPING_GROUP:
     case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING:
@@ -3468,12 +3472,23 @@
                                     META_TAB_LIST_NORMAL,
                                     META_TAB_SHOW_ICON);
       break;
+    case META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES:
+      meta_screen_ensure_tab_popup (screen,
+                                    META_TAB_LIST_NORMAL_ALL_WORKSPACES,
+                                    META_TAB_SHOW_ICON);
+      break;
     case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL:
       meta_screen_ensure_tab_popup (screen,
                                     META_TAB_LIST_NORMAL,
                                     META_TAB_SHOW_INSTANTLY);
       break;
 
+    case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES:
+      meta_screen_ensure_tab_popup (screen,
+                                    META_TAB_LIST_NORMAL_ALL_WORKSPACES,
+                                    META_TAB_SHOW_INSTANTLY);
+      break;
+
     case META_GRAB_OP_KEYBOARD_TABBING_DOCK:
       meta_screen_ensure_tab_popup (screen,
                                     META_TAB_LIST_DOCKS,
@@ -4284,7 +4299,9 @@
     return NULL;
 }
 
-#define IN_TAB_CHAIN(w,t) (((t) == META_TAB_LIST_NORMAL && META_WINDOW_IN_NORMAL_TAB_CHAIN (w)) \
+#define IN_TAB_CHAIN(w,t) \
+  (((t) == META_TAB_LIST_NORMAL && META_WINDOW_IN_NORMAL_TAB_CHAIN (w)) \
+    || ((t) == META_TAB_LIST_NORMAL_ALL_WORKSPACES && META_WINDOW_IN_NORMAL_TAB_CHAIN (w)) \
     || ((t) == META_TAB_LIST_DOCKS && META_WINDOW_IN_DOCK_TAB_CHAIN (w)) \
     || ((t) == META_TAB_LIST_GROUP && META_WINDOW_IN_GROUP_TAB_CHAIN (w, get_focussed_group(w->display))))
 
@@ -4375,56 +4392,76 @@
 meta_display_get_tab_list (MetaDisplay   *display,
                            MetaTabList    type,
                            MetaScreen    *screen,
-                           MetaWorkspace *workspace)
+                           MetaWorkspace *active_workspace)
 {
-  GList *tab_list;
+  GList *tab_list, *workspace_list, *l, link;
+  MetaWorkspace *workspace;
 
-  g_return_val_if_fail (workspace != NULL, NULL);
+  g_return_val_if_fail (active_workspace != NULL, NULL);
+  
+  if (type == META_TAB_LIST_NORMAL_ALL_WORKSPACES)
+    {
+      workspace_list = screen->workspaces;
+      type = META_TAB_LIST_NORMAL;
+    }
+  else
+    {
+      link.next = NULL;
+      link.prev = NULL;
+      link.data = active_workspace;
+      workspace_list = &link;
+    }
 
+  tab_list = NULL;
   /* Windows sellout mode - MRU order. Collect unminimized windows
    * then minimized so minimized windows aren't in the way so much.
    */
-  {
-    GList *tmp;
-    
-    tab_list = NULL;
-    tmp = workspace->mru_list;
-    while (tmp != NULL)
-      {
-        MetaWindow *window = tmp->data;
-        
-        if (!window->minimized &&
-            window->screen == screen &&
-            IN_TAB_CHAIN (window, type))
-          tab_list = g_list_prepend (tab_list, window);
-        
-        tmp = tmp->next;
-      }
-  }
-
-  {
-    GList *tmp;
-    
-    tmp = workspace->mru_list;
-    while (tmp != NULL)
-      {
-        MetaWindow *window = tmp->data;
-        
-        if (window->minimized &&
-            window->screen == screen &&
-            IN_TAB_CHAIN (window, type))
-          tab_list = g_list_prepend (tab_list, window);
-        
-        tmp = tmp->next;
-      }
-  }
-
+  for (l = workspace_list; l != NULL; l = l->next)
+    {
+      GList *tmp;
+      
+      workspace = l->data;
+      
+      tmp = workspace->mru_list;
+      while (tmp != NULL)
+        {
+          MetaWindow *window = tmp->data;
+          
+          if (!window->minimized &&
+              window->screen == screen &&
+              IN_TAB_CHAIN (window, type))
+            tab_list = g_list_prepend (tab_list, window);
+          
+          tmp = tmp->next;
+        }
+    }
+  
+  for (l = workspace_list; l != NULL; l = l->next)
+    {
+      GList *tmp;
+      
+      workspace = l->data;
+      
+      tmp = workspace->mru_list;
+      while (tmp != NULL)
+        {
+          MetaWindow *window = tmp->data;
+          
+          if (window->minimized &&
+              window->screen == screen &&
+              IN_TAB_CHAIN (window, type))
+            tab_list = g_list_prepend (tab_list, window);
+          
+          tmp = tmp->next;
+        }
+    }
+  
   tab_list = g_list_reverse (tab_list);
-
+  
   {
     GSList *tmp;
     MetaWindow *l_window;
-
+    
     tmp = meta_display_list_windows (display);
 
     /* Go through all windows */
@@ -4434,7 +4471,7 @@
 
         /* Check to see if it demands attention */
         if (l_window->wm_state_demands_attention && 
-            l_window->workspace!=workspace) 
+            l_window->workspace!=active_workspace) 
           {
             /* if it does, add it to the popup */
             tab_list = g_list_prepend (tab_list, l_window);
Index: src/core/keybindings.c
===================================================================
--- src/core/keybindings.c	(revision 4074)
+++ src/core/keybindings.c	(working copy)
@@ -1340,9 +1340,11 @@
               break;
  
             case META_GRAB_OP_KEYBOARD_TABBING_NORMAL:
+            case META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES:
             case META_GRAB_OP_KEYBOARD_TABBING_DOCK:
             case META_GRAB_OP_KEYBOARD_TABBING_GROUP:
             case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL:
+            case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES:
             case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK:
             case META_GRAB_OP_KEYBOARD_ESCAPING_GROUP:
               meta_topic (META_DEBUG_KEYBINDINGS,
@@ -2029,6 +2031,7 @@
                       target_window->desc);
           display->mouse_mode = FALSE;
           meta_window_activate (target_window, event->xkey.time);
+          meta_workspace_activate (target_window->workspace, event->xkey.time);
 
           meta_topic (META_DEBUG_KEYBINDINGS,
                       "Ending grab early so we can focus the target window\n");
@@ -2070,6 +2073,7 @@
        switch (display->grab_op)
         {
         case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL:
+        case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES:
         case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK:
          /* carry on */
           break;
@@ -2087,6 +2091,7 @@
       switch (display->grab_op)
         {
         case META_GRAB_OP_KEYBOARD_TABBING_NORMAL:
+        case META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES:
         case META_GRAB_OP_KEYBOARD_TABBING_DOCK:
           /* carry on */
           break;
@@ -2808,6 +2813,8 @@
     {
     case META_TAB_LIST_NORMAL:
       return META_GRAB_OP_KEYBOARD_TABBING_NORMAL;
+    case META_TAB_LIST_NORMAL_ALL_WORKSPACES:
+      return META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES;
     case META_TAB_LIST_DOCKS:
       return META_GRAB_OP_KEYBOARD_TABBING_DOCK;
     case META_TAB_LIST_GROUP:
@@ -2826,6 +2833,8 @@
     {
     case META_TAB_LIST_NORMAL:
       return META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL;
+    case META_TAB_LIST_NORMAL_ALL_WORKSPACES:
+      return META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES;
     case META_TAB_LIST_DOCKS:
       return META_GRAB_OP_KEYBOARD_ESCAPING_DOCK;
     case META_TAB_LIST_GROUP:
@@ -2886,6 +2895,7 @@
                       initial_selection->desc);
           display->mouse_mode = FALSE;
           meta_window_activate (initial_selection, event->xkey.time);
+          meta_workspace_activate (initial_selection->workspace, event->xkey.time);
         }
       else if (meta_display_begin_grab_op (display,
                                            screen,
@@ -2915,6 +2925,7 @@
               meta_display_end_grab_op (display, event->xkey.time);
               display->mouse_mode = FALSE;
               meta_window_activate (initial_selection, event->xkey.time);
+              meta_workspace_activate (initial_selection->workspace, event->xkey.time);
             }
           else
             {
Index: src/core/display-private.h
===================================================================
--- src/core/display-private.h	(revision 4074)
+++ src/core/display-private.h	(working copy)
@@ -432,7 +432,8 @@
 {
   META_TAB_LIST_NORMAL,
   META_TAB_LIST_DOCKS,
-  META_TAB_LIST_GROUP
+  META_TAB_LIST_GROUP,
+  META_TAB_LIST_NORMAL_ALL_WORKSPACES
 } MetaTabList;
 
 typedef enum
