diff --git a/gtk/gtkarrow.c b/gtk/gtkarrow.c
index e6fc3dc..e6e6582 100644
--- a/gtk/gtkarrow.c
+++ b/gtk/gtkarrow.c
@@ -48,10 +48,14 @@ static void     gtk_arrow_get_property (GObject        *object,
                                         guint           prop_id,
                                         GValue         *value,
                                         GParamSpec     *pspec);
+
+static void gtk_arrow_size_request     (GtkWidget      *widget,
+                                        GtkRequisition *requisition);
+static void gtk_arrow_size_allocate    (GtkWidget      *widget,
+                                        GtkAllocation  *allocation);
 static gboolean gtk_arrow_expose       (GtkWidget      *widget,
                                         GdkEventExpose *event);
 
-
 G_DEFINE_TYPE (GtkArrow, gtk_arrow, GTK_TYPE_MISC)
 
 
@@ -67,6 +71,7 @@ gtk_arrow_class_init (GtkArrowClass *class)
   gobject_class->set_property = gtk_arrow_set_property;
   gobject_class->get_property = gtk_arrow_get_property;
 
+  widget_class->size_request = gtk_arrow_size_request;
   widget_class->expose_event = gtk_arrow_expose;
 
   g_object_class_install_property (gobject_class,
@@ -93,6 +98,38 @@ gtk_arrow_class_init (GtkArrowClass *class)
                                                                P_("Amount of space used up by arrow"),
                                                                0.0, 1.0, 0.7,
                                                                GTK_PARAM_READABLE));
+
+  /**
+    * GtkArrow::min-size:
+    *
+    * Specifies the minimum width and height for the arrow.
+    *
+    * Since: 2.16
+    */
+   gtk_widget_class_install_style_property (widget_class,
+                                            g_param_spec_int ("min-size",
+                                                              P_("Arrow Minimum Size"),
+                                                              P_("Minimum size of the arrow widget"),
+                                                              0,
+                                                              G_MAXINT,
+                                                              15,
+                                                              GTK_PARAM_READABLE));
+   /**
+    * GtkArrow::aspect-ratio:
+    *
+    * Sets the height of the arrow as height = aspect-ratio * width.
+    * The default is 1.0, a square arrow.
+    *
+    * Since: 2.16
+    */
+   gtk_widget_class_install_style_property (widget_class,
+                                            g_param_spec_float ("aspect-ratio",
+                                                                P_("Aspect Ratio"),
+                                                                P_("Aspect ratio of the arrow widget"),
+                                                                -G_MAXFLOAT,
+                                                                G_MAXFLOAT,
+                                                                1.0,
+                                                                GTK_PARAM_READABLE));
 }
 
 static void
@@ -144,13 +181,43 @@ gtk_arrow_get_property (GObject         *object,
 }
 
 static void
+gtk_arrow_size_request (GtkWidget      *widget,
+                        GtkRequisition *requisition)
+{
+  gint x_padding, y_padding;
+  gint arrow_min_size;
+  gfloat aspect_ratio;
+
+  GTK_WIDGET_CLASS (gtk_arrow_parent_class)->size_request (widget, requisition);
+
+  gtk_misc_get_padding (GTK_MISC (widget), &x_padding, &y_padding);
+  gtk_widget_style_get (widget,
+                        "min-size", &arrow_min_size,
+                        "aspect-ratio", &aspect_ratio,
+                        NULL);
+
+  switch (GTK_ARROW (widget)->arrow_type)
+    {
+    case GTK_ARROW_LEFT:
+    case GTK_ARROW_RIGHT:
+      requisition->width = (arrow_min_size * aspect_ratio) + x_padding * 2;
+      requisition->height = arrow_min_size + y_padding * 2;
+      break;
+    case GTK_ARROW_UP:
+    case GTK_ARROW_DOWN:
+      requisition->width = arrow_min_size + x_padding * 2;
+      requisition->height = (arrow_min_size * aspect_ratio) + y_padding * 2;
+      break;
+    default:
+      ;
+    }
+}
+
+static void
 gtk_arrow_init (GtkArrow *arrow)
 {
   GTK_WIDGET_SET_FLAGS (arrow, GTK_NO_WINDOW);
 
-  GTK_WIDGET (arrow)->requisition.width = MIN_ARROW_SIZE + GTK_MISC (arrow)->xpad * 2;
-  GTK_WIDGET (arrow)->requisition.height = MIN_ARROW_SIZE + GTK_MISC (arrow)->ypad * 2;
-
   arrow->arrow_type = GTK_ARROW_RIGHT;
   arrow->shadow_type = GTK_SHADOW_OUT;
 }
@@ -212,7 +279,6 @@ gtk_arrow_expose (GtkWidget      *widget,
       GtkShadowType shadow_type;
       gint width, height;
       gint x, y;
-      gint extent;
       gfloat xalign;
       GtkArrowType effective_arrow_type;
       gfloat arrow_scaling;
@@ -221,7 +287,8 @@ gtk_arrow_expose (GtkWidget      *widget,
 
       width = widget->allocation.width - misc->xpad * 2;
       height = widget->allocation.height - misc->ypad * 2;
-      extent = MIN (width, height) * arrow_scaling;
+      width *= arrow_scaling;
+      height *= arrow_scaling;
       effective_arrow_type = arrow->arrow_type;
 
       if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
@@ -236,9 +303,9 @@ gtk_arrow_expose (GtkWidget      *widget,
 	}
 
       x = floor (widget->allocation.x + misc->xpad
-		 + ((widget->allocation.width - extent) * xalign));
+		 + ((widget->allocation.width - width) * xalign));
       y = floor (widget->allocation.y + misc->ypad
-		 + ((widget->allocation.height - extent) * misc->yalign));
+		 + ((widget->allocation.height - height) * misc->yalign));
 
       shadow_type = arrow->shadow_type;
 
@@ -258,7 +325,7 @@ gtk_arrow_expose (GtkWidget      *widget,
 		       widget->state, shadow_type,
 		       &event->area, widget, "arrow",
 		       effective_arrow_type, TRUE,
-		       x, y, extent, extent);
+		       x, y, width, height);
     }
 
   return FALSE;
