diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 958ae25..2f15f1e 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -226,7 +226,6 @@ gtk_activatable_set_use_action_appearance
 
 #if IN_HEADER(__GTK_ADJUSTMENT_H__)
 #if IN_FILE(__GTK_ADJUSTMENT_C__)
-gtk_adjustment_changed
 gtk_adjustment_clamp_page
 gtk_adjustment_configure
 gtk_adjustment_get_type G_GNUC_CONST
@@ -243,7 +242,6 @@ gtk_adjustment_set_upper
 gtk_adjustment_set_step_increment
 gtk_adjustment_set_page_increment
 gtk_adjustment_set_page_size
-gtk_adjustment_value_changed
 #endif
 #endif
 
diff --git a/gtk/gtkadjustment.c b/gtk/gtkadjustment.c
index dd1b3f6..2271868 100644
--- a/gtk/gtkadjustment.c
+++ b/gtk/gtkadjustment.c
@@ -49,6 +49,16 @@ enum
   LAST_SIGNAL
 };
 
+struct _GtkAdjustmentPrivate
+{
+  gdouble value;
+  gdouble lower;
+  gdouble upper;
+  gdouble step_increment;
+  gdouble page_increment;
+  gdouble page_size;
+};
+
 
 static void gtk_adjustment_get_property                (GObject      *object,
                                                         guint         prop_id,
@@ -64,8 +74,6 @@ static void gtk_adjustment_dispatch_properties_changed (GObject      *object,
 
 static guint adjustment_signals[LAST_SIGNAL] = { 0 };
 
-static guint64 adjustment_changed_stamp = 0; /* protected by global gdk lock */
-
 G_DEFINE_TYPE (GtkAdjustment, gtk_adjustment, GTK_TYPE_OBJECT)
 
 static void
@@ -210,12 +218,15 @@ gtk_adjustment_class_init (GtkAdjustmentClass *class)
 static void
 gtk_adjustment_init (GtkAdjustment *adjustment)
 {
-  adjustment->value = 0.0;
-  adjustment->lower = 0.0;
-  adjustment->upper = 0.0;
-  adjustment->step_increment = 0.0;
-  adjustment->page_increment = 0.0;
-  adjustment->page_size = 0.0;
+  adjustment->priv = G_TYPE_INSTANCE_GET_PRIVATE (adjustment,
+						  GTK_TYPE_ADJUSTMENT,
+						  GtkAdjustmentPrivate);
+  adjustment->priv->value = 0.0;
+  adjustment->priv->lower = 0.0;
+  adjustment->priv->upper = 0.0;
+  adjustment->priv->step_increment = 0.0;
+  adjustment->priv->page_increment = 0.0;
+  adjustment->priv->page_size = 0.0;
 }
 
 static void
@@ -224,27 +235,27 @@ gtk_adjustment_get_property (GObject    *object,
                              GValue     *value,
                              GParamSpec *pspec)
 {
-  GtkAdjustment *adjustment = GTK_ADJUSTMENT (object);
+  GtkAdjustmentPrivate *priv = GTK_ADJUSTMENT (object)->priv;
 
   switch (prop_id)
     {
     case PROP_VALUE:
-      g_value_set_double (value, adjustment->value);
+      g_value_set_double (value, priv->value);
       break;
     case PROP_LOWER:
-      g_value_set_double (value, adjustment->lower);
+      g_value_set_double (value, priv->lower);
       break;
     case PROP_UPPER:
-      g_value_set_double (value, adjustment->upper);
+      g_value_set_double (value, priv->upper);
       break;
     case PROP_STEP_INCREMENT:
-      g_value_set_double (value, adjustment->step_increment);
+      g_value_set_double (value, priv->step_increment);
       break;
     case PROP_PAGE_INCREMENT:
-      g_value_set_double (value, adjustment->page_increment);
+      g_value_set_double (value, priv->page_increment);
       break;
     case PROP_PAGE_SIZE:
-      g_value_set_double (value, adjustment->page_size);
+      g_value_set_double (value, priv->page_size);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -258,28 +269,32 @@ gtk_adjustment_set_property (GObject      *object,
                              const GValue *value,
                              GParamSpec   *pspec)
 {
-  GtkAdjustment *adjustment = GTK_ADJUSTMENT (object);
+  GtkAdjustmentPrivate *priv = GTK_ADJUSTMENT (object)->priv;
   gdouble double_value = g_value_get_double (value);
 
   switch (prop_id)
     {
     case PROP_VALUE:
-      gtk_adjustment_set_value (adjustment, double_value);
+      /* don't use CLAMP() so we don't end up below lower if upper - page_size
+       * is smaller than lower
+       */
+      double_value = MIN (double_value, priv->upper - priv->page_size);
+      priv->value = MAX (double_value, priv->lower);
       break;
     case PROP_LOWER:
-      adjustment->lower = double_value;
+      priv->lower = double_value;
       break;
     case PROP_UPPER:
-      adjustment->upper = double_value;
+      priv->upper = double_value;
       break;
     case PROP_STEP_INCREMENT:
-      adjustment->step_increment = double_value;
+      priv->step_increment = double_value;
       break;
     case PROP_PAGE_INCREMENT:
-      adjustment->page_increment = double_value;
+      priv->page_increment = double_value;
       break;
     case PROP_PAGE_SIZE:
-      adjustment->page_size = double_value;
+      priv->page_size = double_value;
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -293,6 +308,7 @@ gtk_adjustment_dispatch_properties_changed (GObject     *object,
                                             GParamSpec **pspecs)
 {
   gboolean changed = FALSE;
+  gboolean value_changed = FALSE;
   gint i;
 
   G_OBJECT_CLASS (gtk_adjustment_parent_class)->dispatch_properties_changed (object, n_pspecs, pspecs);
@@ -307,15 +323,18 @@ gtk_adjustment_dispatch_properties_changed (GObject     *object,
       case PROP_PAGE_SIZE:
         changed = TRUE;
         break;
+      case PROP_VALUE:
+	value_changed = TRUE;
+	break;
       default:
         break;
       }
 
   if (changed)
-    {
-      adjustment_changed_stamp++;
-      gtk_adjustment_changed (GTK_ADJUSTMENT (object));
-    }
+    g_signal_emit (object, adjustment_signals[CHANGED], 0);
+
+  if (value_changed)
+    g_signal_emit (object, adjustment_signals[VALUE_CHANGED], 0);
 }
 
 GtkObject *
@@ -350,7 +369,7 @@ gtk_adjustment_get_value (GtkAdjustment *adjustment)
 {
   g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), 0.0);
 
-  return adjustment->value;
+  return adjustment->priv->value;
 }
 
 void
@@ -359,18 +378,8 @@ gtk_adjustment_set_value (GtkAdjustment *adjustment,
 {
   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  /* don't use CLAMP() so we don't end up below lower if upper - page_size
-   * is smaller than lower
-   */
-  value = MIN (value, adjustment->upper - adjustment->page_size);
-  value = MAX (value, adjustment->lower);
-
-  if (value != adjustment->value)
-    {
-      adjustment->value = value;
-
-      gtk_adjustment_value_changed (adjustment);
-    }
+  if (adjustment->priv->value != value)
+    g_object_set (adjustment, "value", value, NULL);
 }
 
 /**
@@ -388,7 +397,7 @@ gtk_adjustment_get_lower (GtkAdjustment *adjustment)
 {
   g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), 0.0);
 
-  return adjustment->lower;
+  return adjustment->priv->lower;
 }
 
 /**
@@ -418,7 +427,7 @@ gtk_adjustment_set_lower (GtkAdjustment *adjustment,
 {
   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  if (lower != adjustment->lower)
+  if (lower != adjustment->priv->lower)
     g_object_set (adjustment, "lower", lower, NULL);
 }
 
@@ -437,7 +446,7 @@ gtk_adjustment_get_upper (GtkAdjustment *adjustment)
 {
   g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), 0.0);
 
-  return adjustment->upper;
+  return adjustment->priv->upper;
 }
 
 /**
@@ -463,7 +472,7 @@ gtk_adjustment_set_upper (GtkAdjustment *adjustment,
 {
   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  if (upper != adjustment->upper)
+  if (upper != adjustment->priv->upper)
     g_object_set (adjustment, "upper", upper, NULL);
 }
 
@@ -482,7 +491,7 @@ gtk_adjustment_get_step_increment (GtkAdjustment *adjustment)
 {
   g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), 0.0);
 
-  return adjustment->step_increment;
+  return adjustment->priv->step_increment;
 }
 
 /**
@@ -504,7 +513,7 @@ gtk_adjustment_set_step_increment (GtkAdjustment *adjustment,
 {
   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  if (step_increment != adjustment->step_increment)
+  if (step_increment != adjustment->priv->step_increment)
     g_object_set (adjustment, "step-increment", step_increment, NULL);
 }
 
@@ -523,7 +532,7 @@ gtk_adjustment_get_page_increment (GtkAdjustment *adjustment)
 {
   g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), 0.0);
 
-  return adjustment->page_increment;
+  return adjustment->priv->page_increment;
 }
 
 /**
@@ -545,7 +554,7 @@ gtk_adjustment_set_page_increment (GtkAdjustment *adjustment,
 {
   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  if (page_increment != adjustment->page_increment)
+  if (page_increment != adjustment->priv->page_increment)
     g_object_set (adjustment, "page-increment", page_increment, NULL);
 }
 
@@ -564,7 +573,7 @@ gtk_adjustment_get_page_size (GtkAdjustment *adjustment)
 {
   g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), 0.0);
 
-  return adjustment->page_size;
+  return adjustment->priv->page_size;
 }
 
 /**
@@ -586,7 +595,7 @@ gtk_adjustment_set_page_size (GtkAdjustment *adjustment,
 {
   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  if (page_size != adjustment->page_size)
+  if (page_size != adjustment->priv->page_size)
     g_object_set (adjustment, "page-size", page_size, NULL);
 }
 
@@ -617,60 +626,31 @@ gtk_adjustment_configure (GtkAdjustment *adjustment,
                           gdouble        page_increment,
                           gdouble        page_size)
 {
-  gboolean value_changed = FALSE;
-  guint64 old_stamp = adjustment_changed_stamp;
-
   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  g_object_freeze_notify (G_OBJECT (adjustment));
-
-  g_object_set (adjustment,
-                "lower", lower,
-                "upper", upper,
-                "step-increment", step_increment,
-                "page-increment", page_increment,
-                "page-size", page_size,
-                NULL);
-
   /* don't use CLAMP() so we don't end up below lower if upper - page_size
    * is smaller than lower
    */
   value = MIN (value, upper - page_size);
   value = MAX (value, lower);
 
-  if (value != adjustment->value)
-    {
-      /* set value manually to make sure "changed" is emitted with the
-       * new value in place and is emitted before "value-changed"
-       */
-      adjustment->value = value;
-      value_changed = TRUE;
-    }
-
-  g_object_thaw_notify (G_OBJECT (adjustment));
-
-  if (old_stamp == adjustment_changed_stamp)
-    gtk_adjustment_changed (adjustment); /* force emission before ::value-changed */
-
-  if (value_changed)
-    gtk_adjustment_value_changed (adjustment);
-}
-
-void
-gtk_adjustment_changed (GtkAdjustment *adjustment)
-{
-  g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
-
-  g_signal_emit (adjustment, adjustment_signals[CHANGED], 0);
-}
-
-void
-gtk_adjustment_value_changed (GtkAdjustment *adjustment)
-{
-  g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
-
-  g_signal_emit (adjustment, adjustment_signals[VALUE_CHANGED], 0);
-  g_object_notify (G_OBJECT (adjustment), "value");
+  if (value != adjustment->priv->value)
+    g_object_set (adjustment,
+		  "lower", lower,
+		  "upper", upper,
+		  "step-increment", step_increment,
+		  "page-increment", page_increment,
+		  "page-size", page_size,
+		  "value", value,
+		  NULL);
+  else
+    g_object_set (adjustment,
+		  "lower", lower,
+		  "upper", upper,
+		  "step-increment", step_increment,
+		  "page-increment", page_increment,
+		  "page-size", page_size,
+		  NULL);
 }
 
 void
@@ -679,27 +659,30 @@ gtk_adjustment_clamp_page (GtkAdjustment *adjustment,
 			   gdouble        upper)
 {
   gboolean need_emission;
+  GtkAdjustmentPrivate *priv;
 
   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  lower = CLAMP (lower, adjustment->lower, adjustment->upper);
-  upper = CLAMP (upper, adjustment->lower, adjustment->upper);
+  priv = adjustment->priv;
+
+  lower = CLAMP (lower, priv->lower, priv->upper);
+  upper = CLAMP (upper, priv->lower, priv->upper);
 
   need_emission = FALSE;
 
-  if (adjustment->value + adjustment->page_size < upper)
+  if (priv->value + priv->page_size < upper)
     {
-      adjustment->value = upper - adjustment->page_size;
+      priv->value = upper - priv->page_size;
       need_emission = TRUE;
     }
-  if (adjustment->value > lower)
+  if (priv->value > lower)
     {
-      adjustment->value = lower;
+      priv->value = lower;
       need_emission = TRUE;
     }
 
   if (need_emission)
-    gtk_adjustment_value_changed (adjustment);
+    g_signal_emit (adjustment, adjustment_signals[VALUE_CHANGED], 0);
 }
 
 #define __GTK_ADJUSTMENT_C__
diff --git a/gtk/gtkadjustment.h b/gtk/gtkadjustment.h
index 39a6f86..e1d8f61 100644
--- a/gtk/gtkadjustment.h
+++ b/gtk/gtkadjustment.h
@@ -45,19 +45,16 @@ G_BEGIN_DECLS
 #define GTK_ADJUSTMENT_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ADJUSTMENT, GtkAdjustmentClass))
 
 
-typedef struct _GtkAdjustment	    GtkAdjustment;
-typedef struct _GtkAdjustmentClass  GtkAdjustmentClass;
+typedef struct _GtkAdjustment	     GtkAdjustment;
+typedef struct _GtkAdjustmentClass   GtkAdjustmentClass;
+typedef struct _GtkAdjustmentPrivate GtkAdjustmentPrivate;
 
 struct _GtkAdjustment
 {
   GtkObject parent_instance;
 
-  gdouble GSEAL (lower);
-  gdouble GSEAL (upper);
-  gdouble GSEAL (value);
-  gdouble GSEAL (step_increment);
-  gdouble GSEAL (page_increment);
-  gdouble GSEAL (page_size);
+  /*< Private >*/
+  GtkAdjustmentPrivate *priv;
 };
 
 struct _GtkAdjustmentClass
@@ -83,8 +80,6 @@ GtkObject* gtk_adjustment_new			(gdouble	  value,
 						 gdouble	  page_increment,
 						 gdouble	  page_size);
 
-void	   gtk_adjustment_changed		(GtkAdjustment	 *adjustment);
-void	   gtk_adjustment_value_changed		(GtkAdjustment	 *adjustment);
 void	   gtk_adjustment_clamp_page		(GtkAdjustment	 *adjustment,
 						 gdouble	  lower,
 						 gdouble	  upper);
