diff --git a/app/actions/context-actions.c b/app/actions/context-actions.c
index 5b17d7c..ccdd75f 100644
--- a/app/actions/context-actions.c
+++ b/app/actions/context-actions.c
@@ -87,7 +87,12 @@ static const GimpActionEntry context_actions[] =
     NC_("context-action", "S_wap Colors"), "X",
     NC_("context-action", "Exchange foreground and background colors"),
     G_CALLBACK (context_colors_swap_cmd_callback),
-    GIMP_HELP_TOOLBOX_SWAP_COLORS }
+    GIMP_HELP_TOOLBOX_SWAP_COLORS },
+
+  { "context-tools-swap", NULL,
+    NC_("context-action", "Swap Tools"), "<shift>X",
+    NC_("context-action", "Switch to the last used tool"),
+    G_CALLBACK (context_tools_swap_cmd_callback)}
 };
 
 static GimpEnumActionEntry context_palette_foreground_actions[] =
diff --git a/app/actions/context-commands.c b/app/actions/context-commands.c
index ac6f004..17ab89f 100644
--- a/app/actions/context-commands.c
+++ b/app/actions/context-commands.c
@@ -104,6 +104,16 @@ static GimpColormapEditor * context_get_colormap_editor (void);
 /*  public functions  */
 
 void
+context_tools_swap_cmd_callback (GtkAction *action,
+                                  gpointer   data)
+{
+  GimpContext *context;
+  return_if_no_context (context, data);
+
+  gimp_context_swap_tools (context);
+}
+
+void
 context_colors_default_cmd_callback (GtkAction *action,
                                      gpointer   data)
 {
diff --git a/app/actions/context-commands.h b/app/actions/context-commands.h
index 75f65b8..03b8ea8 100644
--- a/app/actions/context-commands.h
+++ b/app/actions/context-commands.h
@@ -20,6 +20,9 @@
 
 
 
+void   context_tools_swap_cmd_callback            (GtkAction *action,
+                                                   gpointer   data);
+
 void   context_colors_default_cmd_callback        (GtkAction *action,
                                                    gpointer   data);
 void   context_colors_swap_cmd_callback           (GtkAction *action,
diff --git a/app/core/gimpcontext.c b/app/core/gimpcontext.c
index 8218ea1..b750e8c 100644
--- a/app/core/gimpcontext.c
+++ b/app/core/gimpcontext.c
@@ -702,6 +702,7 @@ gimp_context_init (GimpContext *context)
 
   context->tool_info       = NULL;
   context->tool_name       = NULL;
+  context->last_tool_info  = NULL;
 
   context->paint_info      = NULL;
   context->paint_name      = NULL;
@@ -879,6 +880,11 @@ gimp_context_finalize (GObject *object)
       g_free (context->tool_name);
       context->tool_name = NULL;
     }
+  if (context->last_tool_info)
+    {
+      g_object_unref (context->last_tool_info);
+      context->last_tool_info = NULL;
+    }
 
   if (context->paint_info)
     {
@@ -1951,6 +1957,12 @@ gimp_context_tool_removed (GimpContainer *container,
       if (! gimp_container_frozen (container))
         gimp_context_tool_list_thaw (container, context);
     }
+
+  if (tool_info == context->last_tool_info)
+    {
+      context->last_tool_info = NULL;
+      g_object_unref(tool_info);
+    }
 }
 
 static void
@@ -1975,9 +1987,13 @@ gimp_context_real_set_tool (GimpContext  *context,
       g_signal_handlers_disconnect_by_func (context->tool_info,
                                             gimp_context_tool_dirty,
                                             context);
-      g_object_unref (context->tool_info);
+    }
+  if (context->last_tool_info)
+    {
+      g_object_unref (context->last_tool_info);
     }
 
+  context->last_tool_info = context->tool_info;
   context->tool_info = tool_info;
 
   if (tool_info)
@@ -2000,6 +2016,15 @@ gimp_context_real_set_tool (GimpContext  *context,
   gimp_context_tool_changed (context);
 }
 
+void
+gimp_context_swap_tools (GimpContext *context)
+{
+  g_return_if_fail (GIMP_IS_CONTEXT (context));
+
+  if (context->last_tool_info)
+    gimp_context_real_set_tool (context, context->last_tool_info);
+}
+
 
 /*****************************************************************************/
 /*  paint info  **************************************************************/
diff --git a/app/core/gimpcontext.h b/app/core/gimpcontext.h
index 31d5f40..5c148c9 100644
--- a/app/core/gimpcontext.h
+++ b/app/core/gimpcontext.h
@@ -60,6 +60,7 @@ struct _GimpContext
 
   GimpToolInfo         *tool_info;
   gchar                *tool_name;
+  GimpToolInfo         *last_tool_info;
 
   GimpPaintInfo        *paint_info;
   gchar                *paint_name;
@@ -220,6 +221,7 @@ GimpToolInfo  * gimp_context_get_tool           (GimpContext     *context);
 void            gimp_context_set_tool           (GimpContext     *context,
                                                  GimpToolInfo    *tool_info);
 void            gimp_context_tool_changed       (GimpContext     *context);
+void            gimp_context_swap_tools         (GimpContext     *context);
 
 
 /*  paint info  */
diff --git a/menus/image-menu.xml.in b/menus/image-menu.xml.in
index c4ff6d8..b2a23f9 100644
--- a/menus/image-menu.xml.in
+++ b/menus/image-menu.xml.in
@@ -582,6 +582,7 @@
       <menuitem action="windows-show-toolbox" />
       <menuitem action="context-colors-default" />
       <menuitem action="context-colors-swap" />
+      <menuitem action="context-tools-swap" />
     </menu>
 
     <menu action="plug-in-menu" name="Filters">
