diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index 8625ef8..b519b09 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -146,6 +146,7 @@ struct _GtkComboBoxPrivate
   guint button_sensitivity : 2;
   guint has_entry : 1;
   guint popup_fixed_width : 1;
+  guint always_show_arrow : 1;
 
   GtkTreeViewRowSeparatorFunc row_separator_func;
   gpointer                    row_separator_data;
@@ -238,7 +239,8 @@ enum {
   PROP_POPUP_FIXED_WIDTH,
   PROP_ID_COLUMN,
   PROP_ACTIVE_ID,
-  PROP_CELL_AREA
+  PROP_CELL_AREA,
+  PROP_ALWAYS_SHOW_ARROW
 };
 
 static guint combo_box_signals[LAST_SIGNAL] = {0,};
@@ -323,6 +325,8 @@ static void     gtk_combo_box_real_move_active     (GtkComboBox      *combo_box,
                                                     GtkScrollType     scroll);
 static void     gtk_combo_box_real_popup           (GtkComboBox      *combo_box);
 static gboolean gtk_combo_box_real_popdown         (GtkComboBox      *combo_box);
+static void     gtk_combo_box_evaluate_arrow       (GtkComboBox      *combo_box);
+
 
 /* listening to the model */
 static void     gtk_combo_box_model_row_inserted   (GtkTreeModel     *model,
@@ -946,6 +950,25 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
                                                          GTK_TYPE_CELL_AREA,
                                                          GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 
+
+   /**
+    * GtkComboBox:always-show-arrow:
+    *
+    * Whether the dropdown menu indicator should always be
+    * shown even if #GtkComboBox:model is %NULL or empty.
+    *
+    * Since: 3.2
+    */
+   g_object_class_install_property (object_class,
+                                    PROP_ALWAYS_SHOW_ARROW,
+                                    g_param_spec_boolean ("always-show-arrow",
+							  P_("Always Show Arrow"),
+							  P_("Whether the dropdown menu indicator should "
+							     "always be shown"),
+							  TRUE,
+							  GTK_PARAM_READWRITE));
+
+
   gtk_widget_class_install_style_property (widget_class,
                                            g_param_spec_boolean ("appears-as-list",
                                                                  P_("Appears as list"),
@@ -1039,6 +1062,7 @@ gtk_combo_box_init (GtkComboBox *combo_box)
   priv->button_sensitivity = GTK_SENSITIVITY_AUTO;
   priv->has_entry = FALSE;
   priv->popup_fixed_width = TRUE;
+  priv->always_show_arrow = TRUE;
 
   priv->text_column = -1;
   priv->text_renderer = NULL;
@@ -1121,6 +1145,11 @@ gtk_combo_box_set_property (GObject      *object,
                                            g_value_get_boolean (value));
       break;
 
+    case PROP_ALWAYS_SHOW_ARROW:
+      gtk_combo_box_set_always_show_arrow (combo_box,
+                                           g_value_get_boolean (value));
+      break;
+
     case PROP_EDITING_CANCELED:
       priv->editing_canceled = g_value_get_boolean (value);
       break;
@@ -1222,6 +1251,10 @@ gtk_combo_box_get_property (GObject    *object,
         g_value_set_boolean (value, combo_box->priv->popup_fixed_width);
         break;
 
+      case PROP_ALWAYS_SHOW_ARROW:
+        g_value_set_boolean (value, combo_box->priv->always_show_arrow);
+        break;
+
       case PROP_EDITING_CANCELED:
         g_value_set_boolean (value, priv->editing_canceled);
         break;
@@ -2358,23 +2391,30 @@ gtk_combo_box_popdown (GtkComboBox *combo_box)
   priv->grab_keyboard = NULL;
 }
 
-#define GTK_COMBO_BOX_SIZE_ALLOCATE_BUTTON                                         \
-  gtk_widget_get_preferred_size (combo_box->priv->button,                        \
-                                 &req, NULL);                                         \
-                                                                                  \
-  if (is_rtl)                                                                         \
-    child.x = allocation->x + border.right;                                        \
-  else                                                                                \
-    child.x = allocation->x + allocation->width - req.width - border.left;        \
-                                                                                    \
-  child.y = allocation->y + border.top;                                                \
-  child.width = req.width;                                                        \
-  child.height = allocation->height - (border.top + border.bottom);                \
-  child.width = MAX (1, child.width);                                                \
-  child.height = MAX (1, child.height);                                                \
-                                                                                  \
-  gtk_widget_size_allocate (combo_box->priv->button, &child);
-
+#define GTK_COMBO_BOX_SIZE_ALLOCATE_BUTTON				\
+  if (gtk_widget_get_visible (combo_box->priv->button))			\
+    {									\
+      gtk_widget_get_preferred_size (combo_box->priv->button,		\
+				     &req, NULL);			\
+  									\
+      if (is_rtl)							\
+	child.x = allocation->x + border.right;				\
+      else								\
+	child.x = allocation->x + allocation->width - req.width - border.left; \
+  									\
+      child.y = allocation->y + border.top;				\
+      child.width = req.width;						\
+      child.height = allocation->height - (border.top + border.bottom);	\
+      child.width = MAX (1, child.width);				\
+      child.height = MAX (1, child.height);				\
+      									\
+      gtk_widget_size_allocate (combo_box->priv->button, &child);	\
+    }									\
+  else									\
+    {									\
+      req.width = 0;							\
+      req.height = 0;							\
+    }
 
 static void
 gtk_combo_box_size_allocate (GtkWidget     *widget,
@@ -2434,22 +2474,30 @@ gtk_combo_box_size_allocate (GtkWidget     *widget,
             }
 
           /* handle the children */
-          gtk_widget_get_preferred_size (priv->arrow, &req, NULL);
-          child.width = req.width;
-          if (!is_rtl)
-            child.x += width - req.width;
-          child.width = MAX (1, child.width);
-          child.height = MAX (1, child.height);
-          gtk_widget_size_allocate (priv->arrow, &child);
-          if (is_rtl)
-            child.x += req.width;
-          gtk_widget_get_preferred_size (priv->separator, &req, NULL);
-          child.width = req.width;
-          if (!is_rtl)
-            child.x -= req.width;
-          child.width = MAX (1, child.width);
-          child.height = MAX (1, child.height);
-          gtk_widget_size_allocate (priv->separator, &child);
+	  if (gtk_widget_get_visible (priv->arrow))
+	    {
+	      gtk_widget_get_preferred_size (priv->arrow, &req, NULL);
+	      child.width = req.width;
+	      if (!is_rtl)
+		child.x += width - req.width;
+	      child.width = MAX (1, child.width);
+	      child.height = MAX (1, child.height);
+	      gtk_widget_size_allocate (priv->arrow, &child);
+	      if (is_rtl)
+		child.x += req.width;
+	    }
+	  memset (&req, 0x0, sizeof (GtkRequisition));
+
+	  if (gtk_widget_get_visible (priv->separator))
+	    {
+	      gtk_widget_get_preferred_size (priv->separator, &req, NULL);
+	      child.width = req.width;
+	      if (!is_rtl)
+		child.x -= req.width;
+	      child.width = MAX (1, child.width);
+	      child.height = MAX (1, child.height);
+	      gtk_widget_size_allocate (priv->separator, &child);
+	    }
 
           if (is_rtl)
             {
@@ -3035,6 +3083,7 @@ gtk_combo_box_menu_setup (GtkComboBox *combo_box,
                     G_CALLBACK (gtk_combo_box_menu_key_press), combo_box);
   gtk_combo_box_set_popup_widget (combo_box, menu);
 
+  gtk_combo_box_evaluate_arrow (combo_box);
   gtk_combo_box_update_title (combo_box);
 }
 
@@ -3152,6 +3201,7 @@ gtk_combo_box_model_row_inserted (GtkTreeModel     *model,
   if (combo_box->priv->tree_view)
     gtk_combo_box_list_popup_resize (combo_box);
 
+  gtk_combo_box_evaluate_arrow (combo_box);
   gtk_combo_box_update_sensitivity (combo_box);
 }
 
@@ -3173,6 +3223,7 @@ gtk_combo_box_model_row_deleted (GtkTreeModel     *model,
   if (priv->tree_view)
     gtk_combo_box_list_popup_resize (combo_box);
 
+  gtk_combo_box_evaluate_arrow (combo_box);
   gtk_combo_box_update_sensitivity (combo_box);
 }
 
@@ -3376,6 +3427,7 @@ gtk_combo_box_list_setup (GtkComboBox *combo_box)
 
   gtk_widget_show (priv->tree_view);
 
+  gtk_combo_box_evaluate_arrow (combo_box);
   gtk_combo_box_update_sensitivity (combo_box);
 }
 
@@ -4336,6 +4388,7 @@ gtk_combo_box_set_model (GtkComboBox  *combo_box,
     }
 
 out:
+  gtk_combo_box_evaluate_arrow (combo_box);
   gtk_combo_box_update_sensitivity (combo_box);
 
   g_object_notify (G_OBJECT (combo_box), "model");
@@ -4934,6 +4987,102 @@ gtk_combo_box_get_popup_fixed_width (GtkComboBox *combo_box)
   return combo_box->priv->popup_fixed_width;
 }
 
+static void
+gtk_combo_box_evaluate_arrow (GtkComboBox *combo_box)
+{
+  gboolean visible = TRUE;
+  gboolean was_visible = TRUE;
+
+  if (!combo_box->priv->always_show_arrow)
+    {
+      GtkTreeIter dummy;
+
+      if (!combo_box->priv->model)
+	visible = FALSE;
+      else if (!gtk_tree_model_get_iter_first (combo_box->priv->model, &dummy))
+	visible = FALSE;
+    }
+
+  if (!combo_box->priv->tree_view && 
+      combo_box->priv->cell_view)
+    {
+      /* menu mode with no custom child widget */
+      was_visible = gtk_widget_get_visible (combo_box->priv->arrow);
+
+      if (visible)
+	{
+	  gtk_widget_show (combo_box->priv->arrow);
+
+	  if (combo_box->priv->separator)
+	    gtk_widget_show (combo_box->priv->separator);
+	}
+      else
+	{
+	  gtk_widget_hide (combo_box->priv->arrow);
+
+	  if (combo_box->priv->separator)
+	    gtk_widget_hide (combo_box->priv->separator);
+	}
+    }
+  else
+    {
+      /* list mode or custom child (or "has-entry" = TRUE) */
+      was_visible = gtk_widget_get_visible (combo_box->priv->button);
+
+      if (visible)
+	gtk_widget_show (combo_box->priv->button);
+      else
+	gtk_widget_hide (combo_box->priv->button);
+    }
+
+  if (visible != was_visible)
+    gtk_widget_queue_resize (GTK_WIDGET (combo_box));
+}
+
+/**
+ * gtk_combo_box_set_always_show_arrow:
+ * @combo_box: a #GtkComboBox
+ * @show_arrow: whether to show the dropdown indicator unconditionally
+ *
+ * Sets whether the dropdown menu indicator should always be
+ * shown even if #GtkComboBox:model is %NULL or empty.
+ *
+ * Since: 3.2
+ */
+void
+gtk_combo_box_set_always_show_arrow (GtkComboBox *combo_box,
+				     gboolean     show_arrow)
+{
+  g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
+
+  if (combo_box->priv->always_show_arrow != show_arrow)
+    {
+      combo_box->priv->always_show_arrow = show_arrow;
+
+      g_object_notify (G_OBJECT (combo_box), "always-show-arrow");
+
+      gtk_combo_box_evaluate_arrow (combo_box);
+    }
+}
+
+/**
+ * gtk_combo_box_get_always_show_arrow:
+ * @combo_box: a #GtkComboBox
+ *
+ * Gets whether the dropdown menu indicator should always be
+ * shown even if #GtkComboBox:model is %NULL or empty.
+ *
+ * Returns: %TRUE if the dropdown menu indicator is shown unconditionally.
+ *
+ * Since: 3.2
+ */
+gboolean
+gtk_combo_box_get_always_show_arrow (GtkComboBox *combo_box)
+{
+  g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), FALSE);
+
+  return combo_box->priv->always_show_arrow;
+}
 
 /**
  * gtk_combo_box_get_popup_accessible:
@@ -5301,15 +5450,18 @@ gtk_combo_box_get_preferred_width (GtkWidget *widget,
       /* menu mode */
       if (priv->cell_view)
         {
-          gint sep_width, arrow_width;
+          gint sep_width = 0, arrow_width = 0;
           gint border_width, xpad;
           GtkBorder button_border;
 
           border_width = gtk_container_get_border_width (GTK_CONTAINER (combo_box));
           get_widget_border (priv->button, &button_border);
 
-          gtk_widget_get_preferred_width (priv->separator, &sep_width, NULL);
-          gtk_widget_get_preferred_width (priv->arrow, &arrow_width, NULL);
+	  if (gtk_widget_get_visible (priv->separator))
+	    gtk_widget_get_preferred_width (priv->separator, &sep_width, NULL);
+
+	  if (gtk_widget_get_visible (priv->arrow))
+	    gtk_widget_get_preferred_width (priv->arrow, &arrow_width, NULL);
 
           xpad = 2 * (border_width + focus_width + focus_pad) +
             button_border.left + button_border.right;
@@ -5357,11 +5509,14 @@ gtk_combo_box_get_preferred_width (GtkWidget *widget,
         }
 
       /* the button */
-      gtk_widget_get_preferred_width (priv->button,
-                                      &button_width, &button_nat_width);
-
-      minimum_width += button_width;
-      natural_width += button_nat_width;
+      if (gtk_widget_get_visible (priv->button))
+	{
+	  gtk_widget_get_preferred_width (priv->button,
+					  &button_width, &button_nat_width);
+
+	  minimum_width += button_width;
+	  natural_width += button_nat_width;
+	}
     }
 
   minimum_width += border->left + border->right;
@@ -5430,19 +5585,26 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
       if (priv->cell_view)
         {
           /* calculate x/y padding and separator/arrow size */
-          gint sep_width, arrow_width, sep_height, arrow_height;
+          gint sep_width = 0, arrow_width = 0, sep_height = 0, arrow_height = 0;
           gint border_width, xpad, ypad;
           GtkBorder button_border;
 
           border_width = gtk_container_get_border_width (GTK_CONTAINER (combo_box));
           get_widget_border (priv->button, &button_border);
 
-          gtk_widget_get_preferred_width (priv->separator, &sep_width, NULL);
-          gtk_widget_get_preferred_width (priv->arrow, &arrow_width, NULL);
-          gtk_widget_get_preferred_height_for_width (priv->separator,
-                                                     sep_width, &sep_height, NULL);
-          gtk_widget_get_preferred_height_for_width (priv->arrow,
-                                                     arrow_width, &arrow_height, NULL);
+	  gtk_widget_get_preferred_width (priv->arrow, &arrow_width, NULL);
+	  gtk_widget_get_preferred_height_for_width (priv->arrow,
+						     arrow_width, &arrow_height, NULL);
+
+	  if (!gtk_widget_get_visible (priv->arrow))
+	    arrow_width = 0;
+
+	  if (gtk_widget_get_visible (priv->separator))
+	    {
+	      gtk_widget_get_preferred_width (priv->separator, &sep_width, NULL);
+	      gtk_widget_get_preferred_height_for_width (priv->separator,
+							 sep_width, &sep_height, NULL);
+	    }
 
           xpad = 2 * (border_width + focus_width + focus_pad) +
             button_border.left + button_border.right;
@@ -5471,7 +5633,8 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
           gtk_widget_get_preferred_height_for_width (priv->button,
                                                      but_width, &but_height, NULL);
 
-          size -= but_width;
+	  if (gtk_widget_get_visible (priv->button))
+	    size -= but_width;
 
           /* Get height-for-width of the child widget, usually a GtkCellArea calculating
            * and fitting the whole treemodel */
@@ -5491,6 +5654,9 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
       gtk_widget_get_preferred_height_for_width (priv->button,
                                                  but_width, &but_height, NULL);
 
+      if (!gtk_widget_get_visible (priv->button))
+	but_width = 0;
+
       if (priv->cell_view_frame && priv->has_frame)
         {
           GtkBorder frame_border;
diff --git a/gtk/gtkcombobox.h b/gtk/gtkcombobox.h
index 124a9bf..4b99317 100644
--- a/gtk/gtkcombobox.h
+++ b/gtk/gtkcombobox.h
@@ -129,6 +129,10 @@ void               gtk_combo_box_set_popup_fixed_width  (GtkComboBox      *combo
                                                          gboolean          fixed);
 gboolean           gtk_combo_box_get_popup_fixed_width  (GtkComboBox      *combo_box);
 
+void               gtk_combo_box_set_always_show_arrow  (GtkComboBox      *combo_box,
+							 gboolean          show_arrow);
+gboolean           gtk_combo_box_get_always_show_arrow  (GtkComboBox      *combo_box);
+
 /* programmatic control */
 void          gtk_combo_box_popup            (GtkComboBox     *combo_box);
 void          gtk_combo_box_popup_for_device (GtkComboBox     *combo_box,
diff --git a/tests/testcombochange.c b/tests/testcombochange.c
index 042c4bf..45ede76 100644
--- a/tests/testcombochange.c
+++ b/tests/testcombochange.c
@@ -25,6 +25,9 @@
 GtkWidget *text_view;
 GtkListStore *model;
 GArray *contents;
+GtkWidget *list_combo;
+GtkWidget *menu_combo;
+GtkWidget *entry_combo;
 
 static char next_value = 'A';
 
@@ -236,6 +239,19 @@ on_animate (void)
   timer = gdk_threads_add_timeout (1000, (GSourceFunc) animation_timer, NULL);
 }
 
+static void
+on_show_arrow (void)
+{
+  gboolean always_show_arrow;
+
+  always_show_arrow = gtk_combo_box_get_always_show_arrow (GTK_COMBO_BOX (menu_combo));
+  always_show_arrow = !always_show_arrow;
+
+  gtk_combo_box_set_always_show_arrow (GTK_COMBO_BOX (menu_combo), always_show_arrow);
+  gtk_combo_box_set_always_show_arrow (GTK_COMBO_BOX (list_combo), always_show_arrow);
+  gtk_combo_box_set_always_show_arrow (GTK_COMBO_BOX (entry_combo), always_show_arrow);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -246,10 +262,8 @@ main (int argc, char **argv)
   GtkWidget *button_vbox;
   GtkWidget *combo_vbox;
   GtkWidget *button;
-  GtkWidget *menu_combo;
   GtkWidget *alignment;
   GtkWidget *label;
-  GtkWidget *list_combo;
   
   test_init ();
 
@@ -294,6 +308,16 @@ main (int argc, char **argv)
   list_combo = create_combo ("list-combo", TRUE);
   gtk_container_add (GTK_CONTAINER (alignment), list_combo);
 
+  label = gtk_label_new (NULL);
+  gtk_label_set_markup (GTK_LABEL (label), "<b>Entry mode</b>");
+  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+  gtk_box_pack_start (GTK_BOX (combo_vbox), label, FALSE, FALSE, 0);
+
+  alignment = g_object_new (GTK_TYPE_ALIGNMENT, "left-padding", 12, NULL);
+  gtk_box_pack_start (GTK_BOX (combo_vbox), alignment, FALSE, FALSE, 0);
+  entry_combo = gtk_combo_box_new_with_model_and_entry (GTK_TREE_MODEL (model));
+  gtk_container_add (GTK_CONTAINER (alignment), entry_combo);
+
   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
   gtk_box_pack_start (GTK_BOX (hbox), scrolled_window, TRUE, TRUE, 0);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
@@ -326,6 +350,10 @@ main (int argc, char **argv)
   gtk_box_pack_start (GTK_BOX (button_vbox), button, FALSE, FALSE, 0);
   g_signal_connect (button, "clicked", G_CALLBACK (on_animate), NULL);
 
+  button = align_button_new ("Always Show Arrow");
+  gtk_box_pack_start (GTK_BOX (button_vbox), button, FALSE, FALSE, 0);
+  g_signal_connect (button, "clicked", G_CALLBACK (on_show_arrow), NULL);
+
   gtk_widget_show_all (dialog);
   gtk_dialog_run (GTK_DIALOG (dialog));
 
