diff --git a/demos/widget-factory/widget-factory.c b/demos/widget-factory/widget-factory.c
index d4b88a5..263f08b 100644
--- a/demos/widget-factory/widget-factory.c
+++ b/demos/widget-factory/widget-factory.c
@@ -1628,7 +1628,7 @@ reset_icon_size (GtkWidget *iv)
 static gchar *
 scale_format_value (GtkScale *scale, gdouble value)
 {
-  return g_strdup (" ");
+  return g_strdup ("THIS IS A WIDE VALUE");
 }
 
 static void
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index 2ded1b8..cfa76cd 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -1880,9 +1880,30 @@ gtk_range_size_request (GtkWidget      *widget,
   GtkRange *range = GTK_RANGE (widget);
   GtkRangePrivate *priv = range->priv;
 
-  gtk_css_gadget_get_preferred_size (priv->gadget, orientation, -1,
-                                     minimum, natural,
-                                     NULL, NULL);
+  /* We want the MAX size request of base and derived */
+  gint own_minimum;
+  gint own_natural;
+  gint derived_minimum;
+  gint derived_natural;
+
+  gtk_css_gadget_get_preferred_size ( priv->gadget, orientation, -1,
+                                     &own_minimum, &own_natural,
+                                      NULL, NULL);
+
+  if (GTK_RANGE_GET_CLASS (range)->get_range_size_request)
+    {
+      GTK_RANGE_GET_CLASS (range)->get_range_size_request
+                                    ( range, orientation,
+                                     &derived_minimum, &derived_natural);
+    }
+  else
+    {
+      derived_minimum = 0;
+      derived_natural = 0;
+    }
+
+  *minimum = MAX (own_minimum, derived_minimum);
+  *natural = MAX (own_natural, derived_natural);
 }
 
 static void
diff --git a/gtk/gtkrange.h b/gtk/gtkrange.h
index b21e844..39aa503 100644
--- a/gtk/gtkrange.h
+++ b/gtk/gtkrange.h
@@ -62,24 +62,29 @@ struct _GtkRangeClass
   G_GNUC_DEPRECATED gchar *slider_detail;
   G_GNUC_DEPRECATED gchar *stepper_detail;
 
-  void (* value_changed)    (GtkRange     *range);
-  void (* adjust_bounds)    (GtkRange     *range,
-                             gdouble	   new_value);
+  void (* value_changed)          (GtkRange       *range);
+  void (* adjust_bounds)          (GtkRange       *range,
+                                   gdouble	   new_value);
 
   /* action signals for keybindings */
-  void (* move_slider)      (GtkRange     *range,
-                             GtkScrollType scroll);
+  void (* move_slider)            (GtkRange       *range,
+                                   GtkScrollType   scroll);
 
   /* Virtual functions */
-  void (* get_range_border) (GtkRange     *range,
-                             GtkBorder    *border_);
+  void (* get_range_border)       (GtkRange       *range,
+                                   GtkBorder      *border_);
 
-  gboolean (* change_value) (GtkRange     *range,
-                             GtkScrollType scroll,
-                             gdouble       new_value);
+  gboolean (* change_value)       (GtkRange       *range,
+                                   GtkScrollType   scroll,
+                                   gdouble         new_value);
+
+  /* Support extra min request from derived, e.g. for Scale value */
+  void (* get_range_size_request) (GtkRange       *range,
+                                   GtkOrientation  orientation,
+                                   gint           *minimum,
+                                   gint           *natural);
 
   /* Padding for future expansion */
-  void (*_gtk_reserved1) (void);
   void (*_gtk_reserved2) (void);
   void (*_gtk_reserved3) (void);
   void (*_gtk_reserved4) (void);
diff --git a/gtk/gtkscale.c b/gtk/gtkscale.c
index 61e2275..28ed269 100644
--- a/gtk/gtkscale.c
+++ b/gtk/gtkscale.c
@@ -197,6 +197,10 @@ static void     gtk_scale_get_preferred_height    (GtkWidget      *widget,
 static void     gtk_scale_style_updated           (GtkWidget      *widget);
 static void     gtk_scale_get_range_border        (GtkRange       *range,
                                                    GtkBorder      *border);
+static void     gtk_scale_get_range_size_request  (GtkRange       *range,
+                                                   GtkOrientation  orientation,
+                                                   gint           *minimum,
+                                                   gint           *natural);
 static void     gtk_scale_finalize                (GObject        *object);
 static void     gtk_scale_screen_changed          (GtkWidget      *widget,
                                                    GdkScreen      *old_screen);
@@ -714,6 +718,7 @@ gtk_scale_class_init (GtkScaleClass *class)
   widget_class->get_preferred_height = gtk_scale_get_preferred_height;
 
   range_class->get_range_border = gtk_scale_get_range_border;
+  range_class->get_range_size_request = gtk_scale_get_range_size_request;
 
   class->get_layout_offsets = gtk_scale_real_get_layout_offsets;
 
@@ -1524,6 +1529,29 @@ gtk_scale_get_range_border (GtkRange  *range,
 }
 
 static void
+gtk_scale_get_range_size_request (GtkRange       *range,
+                                  GtkOrientation  orientation,
+                                  gint           *minimum,
+                                  gint           *natural)
+{
+  GtkCssGadget *value_gadget = GTK_SCALE (range)->priv->value_gadget;
+
+  /* Ensure the base Range requests enough size for our value */
+  if (value_gadget)
+    {
+      gtk_css_gadget_get_preferred_size (value_gadget,
+                                         orientation, -1,
+                                         minimum, natural,
+                                         NULL, NULL);
+    }
+  else
+    {
+      *minimum = 0;
+      *natural = 0;
+    }
+}
+
+static void
 gtk_scale_style_updated (GtkWidget *widget)
 {
   gtk_scale_clear_layout (GTK_SCALE (widget));
