diff -p -up mutter-2.29.1/src/core/prefs.c.switch mutter-2.29.1/src/core/prefs.c
--- mutter-2.29.1/src/core/prefs.c.switch	2010-02-18 17:26:12.000000000 -0200
+++ mutter-2.29.1/src/core/prefs.c	2010-05-08 14:04:27.000000000 -0300
@@ -102,6 +102,7 @@ static char *cursor_theme = NULL;
 static int   cursor_size = 24;
 static gboolean compositing_manager = FALSE;
 static gboolean resize_with_right_button = FALSE;
+static gboolean switch_to_previous_workspace = TRUE;
 static gboolean force_fullscreen = TRUE;
 
 static MetaVisualBellType visual_bell_type = META_VISUAL_BELL_FULLSCREEN_FLASH;
@@ -433,6 +434,11 @@ static MetaBoolPreference preferences_bo
       &no_tab_popup,
       FALSE,
     },
+    { "/apps/mutter/general/switch_to_previous_workspace",
+      META_PREF_SWITCH_TO_PREVIOUS_WORKSPACE,
+      &switch_to_previous_workspace,
+      FALSE,
+    },
     { NULL, 0, NULL, FALSE },
   };
 
@@ -1810,6 +1816,9 @@ meta_preference_to_string (MetaPreferenc
     case META_PREF_FORCE_FULLSCREEN:
       return "FORCE_FULLSCREEN";
 
+    case META_PREF_SWITCH_TO_PREVIOUS_WORKSPACE:
+      return "SWITCH_TO_PREVIOUS_WORKSPACE";
+
     case META_PREF_CLUTTER_PLUGINS:
       return "CLUTTER_PLUGINS";
 
@@ -2795,6 +2804,12 @@ meta_prefs_get_mouse_button_menu (void)
 }
 
 gboolean
+meta_prefs_switch_to_previous_workspace (void)
+{
+  return switch_to_previous_workspace;
+}
+
+gboolean
 meta_prefs_get_force_fullscreen (void)
 {
   return force_fullscreen;
diff -p -up mutter-2.29.1/src/core/screen-private.h.switch mutter-2.29.1/src/core/screen-private.h
--- mutter-2.29.1/src/core/screen-private.h.switch	2010-02-10 15:25:18.000000000 -0200
+++ mutter-2.29.1/src/core/screen-private.h	2010-05-08 14:02:50.000000000 -0300
@@ -83,7 +83,7 @@ struct _MetaScreen
   MetaUI *ui;
   MetaTabPopup *tab_popup, *ws_popup;
 
-  MetaWorkspace *active_workspace;
+  MetaWorkspace *active_workspace, *last_workspace;
 
   /* This window holds the focus when we don't want to focus
    * any actual clients
diff -p -up mutter-2.29.1/src/core/workspace.c.switch mutter-2.29.1/src/core/workspace.c
--- mutter-2.29.1/src/core/workspace.c.switch	2010-02-11 16:06:47.000000000 -0200
+++ mutter-2.29.1/src/core/workspace.c	2010-05-08 14:02:50.000000000 -0300
@@ -542,7 +542,31 @@ meta_workspace_activate_with_focus (Meta
                 meta_workspace_index (workspace));
   
   if (workspace->screen->active_workspace == workspace)
-    return;
+  {
+      meta_verbose("Switching to same workspace detected, going back to previous one!!\n");
+      if (meta_prefs_switch_to_previous_workspace()) {
+          if (workspace->screen->last_workspace) {
+              meta_verbose("Going to desktop %d\n", meta_workspace_index(workspace));
+              meta_workspace_activate_with_focus(workspace->screen->last_workspace,
+                      NULL, timestamp);
+              return;
+          } else {
+              meta_verbose("No old workspace..\n");
+              return;
+          }
+      } else {
+          meta_verbose("Last workspace switching disabled..\n");
+          return;
+      }
+  }
+  else
+  {
+      if (workspace->screen->active_workspace)
+          meta_verbose("Updating last workspace.. current: %d, new: %d\n",
+                  meta_workspace_index(workspace->screen->active_workspace),
+                  meta_workspace_index(workspace));
+      workspace->screen->last_workspace = workspace->screen->active_workspace;
+  }
 
   /* Free any cached pointers to the workspaces's edges from
    * a current resize or move operation */
diff -p -up mutter-2.29.1/src/include/prefs.h.switch mutter-2.29.1/src/include/prefs.h
--- mutter-2.29.1/src/include/prefs.h.switch	2010-02-10 15:04:07.000000000 -0200
+++ mutter-2.29.1/src/include/prefs.h	2010-05-08 14:04:35.000000000 -0300
@@ -62,7 +62,8 @@ typedef enum
   META_PREF_FORCE_FULLSCREEN,
   META_PREF_CLUTTER_PLUGINS,
   META_PREF_LIVE_HIDDEN_WINDOWS,
-  META_PREF_NO_TAB_POPUP
+  META_PREF_NO_TAB_POPUP,
+  META_PREF_SWITCH_TO_PREVIOUS_WORKSPACE
 } MetaPreference;
 
 typedef void (* MetaPrefsChangedFunc) (MetaPreference pref,
@@ -254,6 +255,8 @@ gboolean           meta_prefs_get_visual
 gboolean           meta_prefs_bell_is_audible      (void);
 MetaVisualBellType meta_prefs_get_visual_bell_type (void);
 
+gboolean meta_prefs_switch_to_previous_workspace (void);
+
 #endif
 
 
diff -p -up mutter-2.29.1/src/mutter.schemas.in.switch mutter-2.29.1/src/mutter.schemas.in
--- mutter-2.29.1/src/mutter.schemas.in.switch	2009-09-08 16:18:54.000000000 -0300
+++ mutter-2.29.1/src/mutter.schemas.in	2010-05-08 14:02:51.000000000 -0300
@@ -4,6 +4,24 @@
     <!-- General preferences -->        
 
     <schema>
+      <key>/schemas/apps/mutter/general/switch_to_previous_workspace</key>
+      <applyto>/apps/mutter/general/switch_to_previous_workspace</applyto>
+      <owner>mutter</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+         <short>Remember and recall previous workspace when switching via keyboard shortcuts</short>
+         <long>
+           Set this to true to allow to switch to previous workspace when
+           using the current workspace keybinding. For example, if you switched
+           from workspace 2 to workspace 1 by pressing keyboard shortcut for
+           workspace 1, pressing the same shortcut again while on workspace 1
+           will switch to workspace 2.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/apps/mutter/general/overlay_key</key>
       <applyto>/apps/mutter/general/overlay_key</applyto>
       <owner>mutter</owner>
