diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c
index bf2e596..54676e1 100644
--- a/gtk/gtkspinbutton.c
+++ b/gtk/gtkspinbutton.c
@@ -139,6 +139,7 @@ static gint gtk_spin_button_default_output (GtkSpinButton      *spin_button);
 static gint spin_button_get_arrow_size     (GtkSpinButton      *spin_button);
 static gint spin_button_get_shadow_type    (GtkSpinButton      *spin_button);
 static void spin_button_redraw             (GtkSpinButton      *spin_button);
+static void spin_button_unset_adjustment   (GtkSpinButton      *spin_button);
 
 
 static guint spinbutton_signals[LAST_SIGNAL] = {0};
@@ -204,7 +205,7 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
                                                         P_("Adjustment"),
                                                         P_("The adjustment that holds the value of the spinbutton"),
                                                         GTK_TYPE_ADJUSTMENT,
-                                                        GTK_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
   
   g_object_class_install_property (gobject_class,
                                    PROP_CLIMB_RATE,
@@ -353,6 +354,19 @@ gtk_spin_button_editable_init (GtkEditableClass *iface)
 }
 
 static void
+gtk_spin_button_set_climb_rate (GtkSpinButton *spin_button,
+				gdouble climb_rate)
+{
+  g_object_freeze_notify (G_OBJECT (spin_button));
+
+  if (spin_button->climb_rate != climb_rate)
+    {
+      spin_button->climb_rate = climb_rate;
+    }
+  g_object_thaw_notify (G_OBJECT (spin_button));
+}
+
+static void
 gtk_spin_button_set_property (GObject      *object,
 			      guint         prop_id,
 			      const GValue *value,
@@ -373,16 +387,10 @@ gtk_spin_button_set_property (GObject      *object,
       gtk_spin_button_set_adjustment (spin_button, adjustment);
       break;
     case PROP_CLIMB_RATE:
-      gtk_spin_button_configure (spin_button,
-				 spin_button->adjustment,
-				 g_value_get_double (value),
-				 spin_button->digits);
+      gtk_spin_button_set_climb_rate (spin_button, g_value_get_double (value));
       break;
     case PROP_DIGITS:
-      gtk_spin_button_configure (spin_button,
-				 spin_button->adjustment,
-				 spin_button->climb_rate,
-				 g_value_get_uint (value));
+      gtk_spin_button_set_digits (spin_button, g_value_get_uint (value));
       break;
     case PROP_SNAP_TO_TICKS:
       gtk_spin_button_set_snap_to_ticks (spin_button, g_value_get_boolean (value));
@@ -472,7 +480,7 @@ gtk_spin_button_init (GtkSpinButton *spin_button)
 static void
 gtk_spin_button_finalize (GObject *object)
 {
-  gtk_spin_button_set_adjustment (GTK_SPIN_BUTTON (object), NULL);
+  spin_button_unset_adjustment (GTK_SPIN_BUTTON (object));
   
   G_OBJECT_CLASS (gtk_spin_button_parent_class)->finalize (object);
 }
@@ -1548,26 +1556,11 @@ gtk_spin_button_configure (GtkSpinButton  *spin_button,
 {
   g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
 
-  if (adjustment)
-    gtk_spin_button_set_adjustment (spin_button, adjustment);
-  else
-    adjustment = spin_button->adjustment;
-
-  g_object_freeze_notify (G_OBJECT (spin_button));
-  if (spin_button->digits != digits) 
-    {
-      spin_button->digits = digits;
-      g_object_notify (G_OBJECT (spin_button), "digits");
-    }
-
-  if (spin_button->climb_rate != climb_rate)
-    {
-      spin_button->climb_rate = climb_rate;
-      g_object_notify (G_OBJECT (spin_button), "climb-rate");
-    }
-  g_object_thaw_notify (G_OBJECT (spin_button));
-
-  gtk_adjustment_value_changed (adjustment);
+  g_object_set (G_OBJECT (spin_button),
+		"climb-rate", climb_rate,
+		"digits", digits,
+		adjustment ? "adjustment" : NULL, adjustment,
+		NULL);
 }
 
 GtkWidget *
@@ -1580,9 +1573,11 @@ gtk_spin_button_new (GtkAdjustment *adjustment,
   if (adjustment)
     g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), NULL);
 
-  spin = g_object_new (GTK_TYPE_SPIN_BUTTON, NULL);
-
-  gtk_spin_button_configure (spin, adjustment, climb_rate, digits);
+  spin = g_object_new (GTK_TYPE_SPIN_BUTTON,
+		       "climb-rate", climb_rate,
+		       "digits", digits,
+		       adjustment ? "adjustment" : NULL, adjustment,
+		       NULL);
 
   return GTK_WIDGET (spin);
 }
@@ -1610,16 +1605,14 @@ gtk_spin_button_new_with_range (gdouble min,
 				gdouble max,
 				gdouble step)
 {
-  GtkObject *adj;
+  GtkObject *adjustment;
   GtkSpinButton *spin;
   gint digits;
 
   g_return_val_if_fail (min <= max, NULL);
   g_return_val_if_fail (step != 0.0, NULL);
 
-  spin = g_object_new (GTK_TYPE_SPIN_BUTTON, NULL);
-
-  adj = gtk_adjustment_new (min, min, max, step, 10 * step, 0);
+  adjustment = gtk_adjustment_new (min, min, max, step, 10 * step, 0);
 
   if (fabs (step) >= 1.0 || step == 0.0)
     digits = 0;
@@ -1629,7 +1622,11 @@ gtk_spin_button_new_with_range (gdouble min,
       digits = MAX_DIGITS;
   }
 
-  gtk_spin_button_configure (spin, GTK_ADJUSTMENT (adj), step, digits);
+  spin = g_object_new (GTK_TYPE_SPIN_BUTTON,
+		       "climb-rate", step,
+		       "digits", digits,
+		       "adjustment", adjustment,
+		       NULL);
 
   gtk_spin_button_set_numeric (spin, TRUE);
 
@@ -1640,7 +1637,7 @@ gtk_spin_button_new_with_range (gdouble min,
  * the arrows when the adjustment's range changes, and reevaluate our size request.
  */
 static void
-adjustment_changed_cb (GtkAdjustment *adjustment, gpointer data)
+gtk_spin_button_adjustment_changed (GtkAdjustment *adjustment, gpointer data)
 {
   GtkSpinButton *spin_button;
 
@@ -1650,6 +1647,19 @@ adjustment_changed_cb (GtkAdjustment *adjustment, gpointer data)
   gtk_widget_queue_resize (GTK_WIDGET (spin_button));
 }
 
+static void
+spin_button_unset_adjustment (GtkSpinButton *spin_button)
+{
+  g_signal_handlers_disconnect_by_func (spin_button->adjustment,
+					gtk_spin_button_value_changed,
+					spin_button);
+  g_signal_handlers_disconnect_by_func (spin_button->adjustment,
+					gtk_spin_button_adjustment_changed,
+					spin_button);
+  g_object_unref (spin_button->adjustment);
+  spin_button->adjustment = NULL;
+}
+
 /**
  * gtk_spin_button_set_adjustment:
  * @spin_button: a #GtkSpinButton
@@ -1663,35 +1673,31 @@ gtk_spin_button_set_adjustment (GtkSpinButton *spin_button,
 {
   g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
 
+  if (!adjustment)
+    adjustment = (GtkAdjustment*) gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
+  else
+    g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
+
   if (spin_button->adjustment != adjustment)
     {
       if (spin_button->adjustment)
         {
-	  g_signal_handlers_disconnect_by_func (spin_button->adjustment,
-						gtk_spin_button_value_changed,
-						spin_button);
-	  g_signal_handlers_disconnect_by_func (spin_button->adjustment,
-						adjustment_changed_cb,
-						spin_button);
-	  g_object_unref (spin_button->adjustment);
+	  spin_button_unset_adjustment (spin_button);
         }
       spin_button->adjustment = adjustment;
-      if (adjustment)
-        {
-	  g_object_ref_sink (adjustment);
-	  g_signal_connect (adjustment, "value_changed",
-			    G_CALLBACK (gtk_spin_button_value_changed),
-			    spin_button);
-	  g_signal_connect (adjustment, "changed",
-			    G_CALLBACK (adjustment_changed_cb),
-			    spin_button);
-	  spin_button->timer_step = spin_button->adjustment->step_increment;
-        }
+      g_object_ref_sink (adjustment);
+      g_signal_connect (adjustment, "value_changed",
+			G_CALLBACK (gtk_spin_button_value_changed),
+			spin_button);
+      g_signal_connect (adjustment, "changed",
+			G_CALLBACK (gtk_spin_button_adjustment_changed),
+			spin_button);
+
+      gtk_spin_button_adjustment_changed (spin_button->adjustment, spin_button);
+      gtk_spin_button_value_changed (spin_button->adjustment, spin_button);
 
-      gtk_widget_queue_resize (GTK_WIDGET (spin_button));
+      g_object_notify (G_OBJECT (spin_button), "adjustment");
     }
-
-  g_object_notify (G_OBJECT (spin_button), "adjustment");
 }
 
 /**
