diff -Naur metacity-2.18.5/src/core.c metacity-2.18.5-alt-tab/src/core.c
--- metacity-2.18.5/src/core.c	2007-08-03 17:48:19.000000000 +0200
+++ metacity-2.18.5-alt-tab/src/core.c	2007-08-03 17:35:19.000000000 +0200
@@ -256,6 +256,22 @@
             g_list_append (window->screen->active_workspace->mru_list, 
                            window);
         }
+ 
+      /* Also move the window to the end of the global MRU list
+       */
+      if (window->screen)
+        {
+          GList* link;
+          link = g_list_find (window->screen->mru_list, window);
+          g_assert (link);
+
+          window->screen->mru_list = 
+            g_list_remove_link (window->screen->mru_list, link);
+          g_list_free (link);
+
+          window->screen->mru_list = 
+            g_list_append (window->screen->mru_list, window);
+        }
     }
 
   /* focus the default window, if needed */
diff -Naur metacity-2.18.5/src/display.c metacity-2.18.5-alt-tab/src/display.c
--- metacity-2.18.5/src/display.c	2007-08-03 17:48:19.000000000 +0200
+++ metacity-2.18.5-alt-tab/src/display.c	2007-08-03 17:52:59.000000000 +0200
@@ -4306,7 +4306,7 @@
       tmp = tmp->next;
     }
 
-  tmp = workspace->mru_list;
+  tmp = screen->mru_list;
   while (tmp != start)
     {
       MetaWindow *window = tmp->data;
@@ -4347,7 +4347,7 @@
       tmp = tmp->prev;
     }
 
-  tmp = g_list_last (workspace->mru_list);
+  tmp = g_list_last (screen->mru_list);
   while (tmp != start)
     {
       MetaWindow *window = tmp->data;
@@ -4378,7 +4378,7 @@
     GList *tmp;
     
     tab_list = NULL;
-    tmp = workspace->mru_list;
+    tmp = screen->mru_list;
     while (tmp != NULL)
       {
         MetaWindow *window = tmp->data;
@@ -4395,7 +4395,7 @@
   {
     GList *tmp;
     
-    tmp = workspace->mru_list;
+    tmp = screen->mru_list;
     while (tmp != NULL)
       {
         MetaWindow *window = tmp->data;
diff -Naur metacity-2.18.5/src/keybindings.c metacity-2.18.5-alt-tab/src/keybindings.c
--- metacity-2.18.5/src/keybindings.c	2007-08-03 17:48:19.000000000 +0200
+++ metacity-2.18.5-alt-tab/src/keybindings.c	2007-08-03 17:09:29.000000000 +0200
@@ -2446,7 +2446,11 @@
                       "selection and turning mouse_mode off\n",
                       target_window->desc);
           display->mouse_mode = FALSE;
-          meta_window_activate (target_window, event->xkey.time);
+
+          if (screen->active_workspace == target_window->workspace)
+            meta_window_activate (target_window, event->xkey.time);
+          else
+            meta_workspace_activate_with_focus (target_window->workspace, target_window, event->xkey.time);
 
           meta_topic (META_DEBUG_KEYBINDINGS,
                       "Ending grab early so we can focus the target window\n");
diff -Naur metacity-2.18.5/src/screen.c metacity-2.18.5-alt-tab/src/screen.c
--- metacity-2.18.5/src/screen.c	2007-08-03 17:48:19.000000000 +0200
+++ metacity-2.18.5-alt-tab/src/screen.c	2007-08-03 17:54:35.000000000 +0200
@@ -527,6 +527,8 @@
   screen->default_xvisual = DefaultVisualOfScreen (screen->xscreen);
   screen->default_depth = DefaultDepthOfScreen (screen->xscreen);
   screen->flash_window = None;
+  
+  screen->mru_list = NULL;
 
   screen->wm_sn_selection_window = new_wm_sn_owner;
   screen->wm_sn_atom = wm_sn_atom;
@@ -702,6 +704,8 @@
     }
 #endif
   
+  g_list_free (screen->mru_list);
+
   meta_ui_free (screen->ui);
 
   meta_stack_free (screen->stack);
diff -Naur metacity-2.18.5/src/screen.h metacity-2.18.5-alt-tab/src/screen.h
--- metacity-2.18.5/src/screen.h	2007-08-03 17:48:19.000000000 +0200
+++ metacity-2.18.5-alt-tab/src/screen.h	2007-08-03 17:27:10.000000000 +0200
@@ -120,6 +120,9 @@
 
   /* Managed by compositor.c */
   gpointer compositor_data;
+  
+  /* This list maintains a list of all windows in MRU order */
+  GList *mru_list;
 };
 
 MetaScreen*   meta_screen_new                 (MetaDisplay                *display,
diff -Naur metacity-2.18.5/src/window.c metacity-2.18.5-alt-tab/src/window.c
--- metacity-2.18.5/src/window.c	2007-08-03 17:48:19.000000000 +0200
+++ metacity-2.18.5-alt-tab/src/window.c	2007-08-03 17:32:29.000000000 +0200
@@ -3998,6 +3998,9 @@
       if (!g_list_find (workspace->mru_list, window))
         workspace->mru_list = g_list_prepend (workspace->mru_list, window);
 
+      if (!g_list_find (window->screen->mru_list, window))
+        window->screen->mru_list = g_list_prepend (window->screen->mru_list, window);
+
       tmp = tmp->next;
     }
 
@@ -4996,6 +4999,23 @@
           window->display->focus_window = window;
           window->has_focus = TRUE;
 
+          /* Move to the front of the global MRU list. We should only 
+           * be "removing" it from the MRU list if it's not already 
+           * there.
+           */
+            {
+              GList* link;
+              link = g_list_find (window->screen->mru_list, window);
+              g_assert (link);
+
+              window->screen->mru_list = 
+                g_list_remove_link (window->screen->mru_list, link);
+              g_list_free (link);
+
+              window->screen->mru_list = 
+                g_list_prepend (window->screen->mru_list, window);
+            }
+
           /* Move to the front of the focusing workspace's MRU list.
            * We should only be "removing" it from the MRU list if it's
            * not already there.  Note that it's possible that we might
@@ -7791,6 +7811,27 @@
                               after_this_one_position->next,
                               window);
     }
+
+
+  /* we need to do the same again for the global MRU list
+   */
+
+  active_mru_list         = window->screen->mru_list;
+  window_position         = g_list_find (active_mru_list, window);
+  after_this_one_position = g_list_find (active_mru_list, after_this_one);
+
+  if (after_this_one_position == NULL)
+    return;
+
+  if (g_list_length (window_position) > g_list_length (after_this_one_position))
+    {
+      window->screen->mru_list =
+        g_list_delete_link (window->screen->mru_list, window_position);
+
+      window->screen->active_workspace->mru_list =
+        g_list_insert_before (window->screen->mru_list, after_this_one_position->next,
+                              window);
+    }
 }
 
 void
diff -Naur metacity-2.18.5/src/workspace.c metacity-2.18.5-alt-tab/src/workspace.c
--- metacity-2.18.5/src/workspace.c	2007-08-03 17:48:19.000000000 +0200
+++ metacity-2.18.5-alt-tab/src/workspace.c	2007-08-03 17:45:30.000000000 +0200
@@ -163,6 +163,10 @@
       workspace->mru_list = g_list_prepend (workspace->mru_list, window);
     }
 
+  /* Also put it in the global MRU list */
+  if (!g_list_find (workspace->screen->mru_list, window))
+    workspace->screen->mru_list =  g_list_prepend (workspace->screen->mru_list, window);
+
   workspace->windows = g_list_prepend (workspace->windows, window);
   window->workspace = workspace;
 
@@ -213,6 +217,10 @@
       g_assert (g_list_find (workspace->mru_list, window) == NULL);
     }
 
+  /* also remove it from the global MRU list */
+  workspace->screen->mru_list = 
+      g_list_remove (workspace->screen->mru_list, window);
+
   meta_window_set_current_workspace_hint (window);
   
   meta_window_queue_calc_showing (window);
