diff -b -u -r -x Makefile -x .deps gimp-2.0pre1/app/tools/gimpcropoptions.c gimp-2.0pre1-new/app/tools/gimpcropoptions.c
--- gimp-2.0pre1/app/tools/gimpcropoptions.c	2004-01-09 23:36:58.000000000 +0100
+++ gimp-2.0pre1-new/app/tools/gimpcropoptions.c	2004-01-09 22:38:17.000000000 +0100
@@ -40,6 +40,7 @@
   PROP_0,
   PROP_LAYER_ONLY,
   PROP_ALLOW_ENLARGE,
+  PROP_KEEP_ASPECT,
   PROP_CROP_MODE
 };
 
@@ -108,6 +109,10 @@
                                     "allow-enlarge", NULL,
                                     FALSE,
                                     0);
+  GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_KEEP_ASPECT,
+                                    "keep-aspect", NULL,
+                                    FALSE,
+                                    0);
   GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_CROP_MODE,
                                  "crop-mode", NULL,
                                  GIMP_TYPE_CROP_MODE,
@@ -136,6 +141,9 @@
     case PROP_ALLOW_ENLARGE:
       options->allow_enlarge = g_value_get_boolean (value);
       break;
+    case PROP_KEEP_ASPECT:
+      options->keep_aspect = g_value_get_boolean (value);
+      break;
     case PROP_CROP_MODE:
       options->crop_mode = g_value_get_enum (value);
       break;
@@ -161,6 +169,9 @@
     case PROP_ALLOW_ENLARGE:
       g_value_set_boolean (value, options->allow_enlarge);
       break;
+    case PROP_KEEP_ASPECT:
+      g_value_set_boolean (value, options->keep_aspect);
+      break;
     case PROP_CROP_MODE:
       g_value_set_enum (value, options->crop_mode);
       break;
@@ -208,5 +219,12 @@
 
   g_free (str);
 
+  /*  layer toggle  */
+  str = g_strdup_printf (_("Keep Aspect ratio  %s"), gimp_get_mod_name_shift());
+  button = gimp_prop_check_button_new (config, "keep-aspect", str);
+//                                       _("Keep Aspect ratio"));
+  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+  gtk_widget_show (button);
+
   return vbox;
 }
diff -b -u -r -x Makefile -x .deps gimp-2.0pre1/app/tools/gimpcropoptions.h gimp-2.0pre1-new/app/tools/gimpcropoptions.h
--- gimp-2.0pre1/app/tools/gimpcropoptions.h	2004-01-09 23:36:58.000000000 +0100
+++ gimp-2.0pre1-new/app/tools/gimpcropoptions.h	2004-01-08 20:43:46.000000000 +0100
@@ -40,6 +40,7 @@
 
   gboolean         layer_only;
   gboolean         allow_enlarge;
+  gboolean         keep_aspect;
   GimpCropMode     crop_mode;
 };
 
diff -b -u -r -x Makefile -x .deps gimp-2.0pre1/app/tools/gimpcroptool.c gimp-2.0pre1-new/app/tools/gimpcroptool.c
--- gimp-2.0pre1/app/tools/gimpcroptool.c	2004-01-09 23:36:58.000000000 +0100
+++ gimp-2.0pre1-new/app/tools/gimpcroptool.c	2004-01-09 22:38:30.000000000 +0100
@@ -140,6 +140,8 @@
 					     GimpCropTool    *crop);
 static void   crop_size_changed             (GtkWidget       *widget,
 					     GimpCropTool    *crop);
+static void   crop_aspect_changed           (GtkWidget       *widget,
+					     GimpCropTool    *crop);
 
 
 static GimpDrawToolClass *parent_class = NULL;
@@ -404,14 +406,24 @@
 	  x2 = CLAMP (x2, min_x, max_x);
 	  y2 = CLAMP (y2, min_y, max_y);
 	}
+      g_object_set (options, "keep-aspect", FALSE, NULL);
+      crop->change_aspect_ratio = TRUE;
       break;
 
     case RESIZING_LEFT:
       x1 = crop->x1 + inc_x;
       y1 = crop->y1 + inc_y;
+     if (options->keep_aspect && crop->aspect_ratio != 0)
+       {
+         y1 = crop->y2 + (gint)((gdouble)(x1 - crop->x2) / crop->aspect_ratio);
+       }
       if (! options->allow_enlarge)
 	{
 	  x1 = CLAMP (x1, min_x, max_x);
+          if ((y1 < CLAMP (y1, min_y, max_y)) && (options->keep_aspect))
+            {
+              x1 = crop->x1;
+            }
 	  y1 = CLAMP (y1, min_y, max_y);
 	}
       x2 = MAX (x1, crop->x2);
@@ -423,9 +435,17 @@
     case RESIZING_RIGHT:
       x2 = crop->x2 + inc_x;
       y2 = crop->y2 + inc_y;
+      if (options->keep_aspect && crop->aspect_ratio != 0)
+        {
+          y2 = crop->y1 + (gint)((gdouble)(x2 - crop->x1) / crop->aspect_ratio);
+        }
       if (! options->allow_enlarge)
 	{
 	  x2 = CLAMP (x2, min_x, max_x);
+          if ((y2 > CLAMP (y2, min_y, max_y)) && (options->keep_aspect))
+            {
+              x2 = crop->x2;
+            }
 	  y2 = CLAMP (y2, min_y, max_y);
 	}
       x1 = MIN (crop->x1, x2);
@@ -610,6 +630,17 @@
         g_object_set (options, "allow-enlarge", FALSE, NULL);
     }
 
+  if (state & GDK_SHIFT_MASK)
+    {
+      if (! options->keep_aspect)
+        g_object_set (options, "keep-aspect", TRUE, NULL);
+    }
+  else
+    {
+      if (options->keep_aspect)
+        g_object_set (options, "keep-aspect", FALSE, NULL);
+    }
+
   if (key == GDK_CONTROL_MASK)
     {
       switch (options->crop_mode)
@@ -945,6 +976,7 @@
   GtkWidget        *spinbutton;
   GtkWidget        *bbox;
   GtkWidget        *button;
+  GtkWidget        *widget;
   const gchar      *stock_id;
 
   tool = GIMP_TOOL (crop);
@@ -1014,6 +1046,15 @@
   gtk_table_set_row_spacing (GTK_TABLE (crop->crop_info->info_table), 1, 6);
   gtk_table_set_row_spacing (GTK_TABLE (crop->crop_info->info_table), 2, 0);
 
+  widget = 
+      info_dialog_add_spinbutton (crop->crop_info, _("Aspect Ratio:"),
+                                  &(crop->aspect_ratio),
+                                  0, 65536, 0.01, 0.1, 1, 1, 2,
+                                  G_CALLBACK (crop_aspect_changed),
+                                  crop);
+  gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (widget), TRUE);
+
+  
   /* Create the area selection buttons */
   bbox = gtk_hbutton_box_new ();
   gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_SPREAD);
@@ -1046,6 +1087,26 @@
 static void
 crop_info_update (GimpCropTool *crop)
 {
+  GimpTool	  *tool;
+  GimpCropOptions *options;
+	
+  tool    = GIMP_TOOL (crop);
+  options = GIMP_CROP_OPTIONS (tool->tool_info->tool_options);
+	  
+  if (!options->keep_aspect)
+    {
+      if ((crop->y2 - crop->y1) != 0)
+      {
+	if (crop->change_aspect_ratio == TRUE)
+	{
+          crop->aspect_ratio = (gdouble)(crop->x2 - crop->x1) / (gdouble)(crop->y2 - crop->y1);
+	}
+      }
+      else
+      {
+        crop->aspect_ratio = 0;
+      }
+    }
   crop->orig_vals[0] = crop->x1;
   crop->orig_vals[1] = crop->y1;
   crop->size_vals[0] = crop->x2 - crop->x1;
@@ -1248,3 +1309,21 @@
       gimp_draw_tool_resume (GIMP_DRAW_TOOL (crop));
     }
 }
+
+static void
+crop_aspect_changed (GtkWidget    *widget,
+		   GimpCropTool *crop)
+{
+  crop->aspect_ratio = GTK_ADJUSTMENT (widget)->value;
+
+  gimp_draw_tool_pause (GIMP_DRAW_TOOL (crop));
+
+  crop->y2 = (gint)((gdouble)(crop->x2 - crop->x1) / crop->aspect_ratio) + crop->y1;
+
+  crop->change_aspect_ratio = FALSE;
+  crop_recalc (crop);
+  crop->change_aspect_ratio = TRUE;
+
+  gimp_draw_tool_resume (GIMP_DRAW_TOOL (crop));
+}
+
diff -b -u -r -x Makefile -x .deps gimp-2.0pre1/app/tools/gimpcroptool.h gimp-2.0pre1-new/app/tools/gimpcroptool.h
--- gimp-2.0pre1/app/tools/gimpcroptool.h	2004-01-09 23:36:58.000000000 +0100
+++ gimp-2.0pre1-new/app/tools/gimpcroptool.h	2004-01-09 16:59:33.000000000 +0100
@@ -63,6 +63,12 @@
 
   gdouble       orig_vals[2];
   gdouble       size_vals[2];
+  gdouble	aspect_ratio;
+  gboolean	change_aspect_ratio; /* Boolean for the crop_info_update function */
+  				     /* aspect_ratio should not be chaget whith   */
+  				     /* crop_info_update when is called from      */
+				     /* crop_aspect_changed, due to the innacurate*/
+  				     /* decimal precision                         */
 
   GtkWidget    *origin_sizeentry;
   GtkWidget    *size_sizeentry;
