Index: app/tools/gimpmovetool.c
===================================================================
--- app/tools/gimpmovetool.c	(revision 24105)
+++ app/tools/gimpmovetool.c	(working copy)
@@ -583,7 +583,7 @@
     {
       g_object_set (options, "move-current", ! options->move_current, NULL);
     }
-  else if (key == GDK_MOD1_MASK || key == GDK_CONTROL_MASK)
+  else if (key == GDK_MOD1_MASK)
     {
       GimpTransformType button_type;
 
@@ -591,7 +591,7 @@
 
       if (press)
         {
-          if (key == (state & (GDK_MOD1_MASK | GDK_CONTROL_MASK)))
+          if (key == (state & GDK_MOD1_MASK))
             {
               /*  first modifier pressed  */
 
@@ -600,7 +600,7 @@
         }
       else
         {
-          if (! (state & (GDK_MOD1_MASK | GDK_CONTROL_MASK)))
+          if (! (state & GDK_MOD1_MASK))
             {
               /*  last modifier released  */
 
@@ -612,10 +612,6 @@
         {
           button_type = GIMP_TRANSFORM_TYPE_SELECTION;
         }
-      else if (state & GDK_CONTROL_MASK)
-        {
-          button_type = GIMP_TRANSFORM_TYPE_PATH;
-        }
 
       if (button_type != options->move_type)
         {
Index: app/tools/gimpeditselectiontool.c
===================================================================
--- app/tools/gimpeditselectiontool.c	(revision 24105)
+++ app/tools/gimpeditselectiontool.c	(working copy)
@@ -111,6 +111,8 @@
   edit_selection_tool->cumly      = 0;
 
   edit_selection_tool->first_move = TRUE;
+
+  edit_selection_tool->constrain  = FALSE;
 }
 
 static void
@@ -207,6 +209,10 @@
   edit_select->x = edit_select->origx = coords->x - off_x;
   edit_select->y = edit_select->origy = coords->y - off_y;
 
+  /* remember starting point for use in constrained movement */
+  edit_select->startx = coords->x;
+  edit_select->starty = coords->y;
+
   switch (edit_select->edit_mode)
     {
     case GIMP_TRANSLATE_MODE_CHANNEL:
@@ -530,6 +536,7 @@
   GimpItem              *active_item;
   gint                   off_x, off_y;
   gdouble                motion_x, motion_y;
+  gint                   x0, y0;
 
   gdk_flush ();
 
@@ -542,9 +549,29 @@
 
   gimp_item_offsets (active_item, &off_x, &off_y);
 
-  motion_x = coords->x - off_x;
-  motion_y = coords->y - off_y;
+  if (state & GDK_CONTROL_MASK)
+    edit_select->constrain = TRUE;
+  else
+    edit_select->constrain = FALSE;
 
+  x0 = coords->x;
+  y0 = coords->y;
+
+  if (edit_select->constrain)
+    {
+      gint deltax = x0 - edit_select->startx;
+      gint deltay = y0 - edit_select->starty;
+
+      if (ABS (deltax) > ABS (deltay))
+        y0 = edit_select->starty;
+      else
+        x0 = edit_select->startx;
+    }
+
+  motion_x = x0 - off_x;
+  motion_y = y0 - off_y;
+
+
   /* now do the actual move. */
 
   gimp_edit_selection_tool_calc_coords (edit_select,
@@ -970,8 +997,6 @@
 
   if (kevent->state & GDK_MOD1_MASK)
     translate_type = GIMP_TRANSFORM_TYPE_SELECTION;
-  else if (kevent->state & GDK_CONTROL_MASK)
-    translate_type = GIMP_TRANSFORM_TYPE_PATH;
   else
     translate_type = GIMP_TRANSFORM_TYPE_LAYER;
 
Index: app/tools/gimpeditselectiontool.h
===================================================================
--- app/tools/gimpeditselectiontool.h	(revision 24105)
+++ app/tools/gimpeditselectiontool.h	(working copy)
@@ -53,6 +53,9 @@
   gboolean            first_move;      /*  Don't push undos after the first  */
 
   gboolean            propagate_release;
+
+  gboolean            constrain;       /*  Move only horiz or vert if TRUE   */
+  gint                startx, starty;  /*  Coords when button was pressed    */
 };
 
 struct _GimpEditSelectionToolClass
