diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt
index e420b4e..da659d1 100644
--- a/docs/reference/gtk/gtk3-sections.txt
+++ b/docs/reference/gtk/gtk3-sections.txt
@@ -804,6 +804,8 @@ gtk_combo_box_get_button_sensitivity
 gtk_combo_box_get_has_entry
 gtk_combo_box_set_entry_text_column
 gtk_combo_box_get_entry_text_column
+gtk_combo_box_set_id_column
+gtk_combo_box_get_id_column
 <SUBSECTION Standard>
 GTK_TYPE_COMBO_BOX
 GTK_COMBO_BOX
@@ -823,8 +825,9 @@ GtkComboBoxText
 gtk_combo_box_text_new
 gtk_combo_box_text_new_with_entry
 gtk_combo_box_text_append_text
-gtk_combo_box_text_insert_text
 gtk_combo_box_text_prepend_text
+gtk_combo_box_text_insert_text
+gtk_combo_box_text_insert_text_with_id
 gtk_combo_box_text_remove
 gtk_combo_box_text_remove_all
 gtk_combo_box_text_get_active_text
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 6a297bb..0d338e2 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -795,12 +795,14 @@ gtk_color_selection_dialog_get_color_selection
 #if IN_HEADER(__GTK_COMBO_BOX_H__)
 #if IN_FILE(__GTK_COMBO_BOX_C__)
 gtk_combo_box_get_active
+gtk_combo_box_get_active_id
 gtk_combo_box_get_active_iter
 gtk_combo_box_get_add_tearoffs
 gtk_combo_box_get_column_span_column
 gtk_combo_box_get_entry_text_column
 gtk_combo_box_get_focus_on_click
 gtk_combo_box_get_has_entry
+gtk_combo_box_get_id_column
 gtk_combo_box_get_model
 gtk_combo_box_get_popup_accessible
 gtk_combo_box_get_popup_fixed_width
@@ -817,11 +819,13 @@ gtk_combo_box_popdown
 gtk_combo_box_popup
 gtk_combo_box_popup_for_device
 gtk_combo_box_set_active
+gtk_combo_box_set_active_id
 gtk_combo_box_set_active_iter
 gtk_combo_box_set_add_tearoffs
 gtk_combo_box_set_column_span_column
 gtk_combo_box_set_entry_text_column
 gtk_combo_box_set_focus_on_click
+gtk_combo_box_set_id_column
 gtk_combo_box_set_model
 gtk_combo_box_set_popup_fixed_width
 gtk_combo_box_set_row_separator_func
@@ -838,6 +842,7 @@ gtk_combo_box_text_append_text
 gtk_combo_box_text_get_active_text
 gtk_combo_box_text_get_type G_GNUC_CONST
 gtk_combo_box_text_insert_text
+gtk_combo_box_text_insert_text_with_id
 gtk_combo_box_text_new
 gtk_combo_box_text_new_with_entry
 gtk_combo_box_text_prepend_text
diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index 9329792..811d6bd 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -143,6 +143,8 @@ struct _GtkComboBoxPrivate
   gint  text_column;
   GtkCellRenderer *text_renderer;
 
+  gint id_column;
+
   GSList *cells;
 
   guint popup_in_progress : 1;
@@ -245,7 +247,9 @@ enum {
   PROP_EDITING_CANCELED,
   PROP_HAS_ENTRY,
   PROP_ENTRY_TEXT_COLUMN,
-  PROP_POPUP_FIXED_WIDTH
+  PROP_POPUP_FIXED_WIDTH,
+  PROP_ID_COLUMN,
+  PROP_ACTIVE_ID
 };
 
 static guint combo_box_signals[LAST_SIGNAL] = {0,};
@@ -949,6 +953,32 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
 						      GTK_PARAM_READWRITE));
 
    /**
+    * GtkComboBox:id-column:
+    *
+    * The column in the combo box's model that provides numeric
+    * IDs for the values in the model, if != -1.
+    *
+    * Since: 3.0
+    */
+   g_object_class_install_property (object_class,
+                                    PROP_ID_COLUMN,
+                                    g_param_spec_int ("id-column",
+                                                      P_("ID Column"),
+                                                      P_("The column in the combo box's model that provides "
+                                                      "numeric IDs for the values in the model"),
+                                                      -1, G_MAXINT, -1,
+                                                      GTK_PARAM_READWRITE));
+
+   g_object_class_install_property (object_class,
+                                    PROP_ACTIVE_ID,
+                                    g_param_spec_int ("active-id",
+                                                      P_("Active id"),
+                                                      P_("The value of the id column "
+                                                      "for the active row"),
+                                                      G_MININT, G_MAXINT, 0,
+                                                      GTK_PARAM_READWRITE));
+
+   /**
     * GtkComboBox:popup-fixed-width:
     *
     * Whether the popup's width should be a fixed width matching the
@@ -1077,6 +1107,7 @@ gtk_combo_box_init (GtkComboBox *combo_box)
 
   priv->text_column = -1;
   priv->text_renderer = NULL;
+  priv->id_column = -1;
 
   gtk_combo_box_check_appearance (combo_box);
 }
@@ -1168,6 +1199,14 @@ gtk_combo_box_set_property (GObject      *object,
       gtk_combo_box_set_entry_text_column (combo_box, g_value_get_int (value));
       break;
 
+    case PROP_ID_COLUMN:
+      gtk_combo_box_set_id_column (combo_box, g_value_get_int (value));
+      break;
+
+    case PROP_ACTIVE_ID:
+      gtk_combo_box_set_active_id (combo_box, g_value_get_int (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1245,6 +1284,14 @@ gtk_combo_box_get_property (GObject    *object,
 	g_value_set_int (value, priv->text_column);
 	break;
 
+      case PROP_ID_COLUMN:
+        g_value_set_int (value, priv->id_column);
+        break;
+
+      case PROP_ACTIVE_ID:
+        g_value_set_int (value, gtk_combo_box_get_active_id (combo_box));
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
         break;
@@ -6573,3 +6620,101 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
   if (natural_size)
     *natural_size = nat_height;
 }
+
+/**
+ * gtk_combo_box_set_id_column:
+ * @combo_box: A #GtkComboBox
+ * @id_column: A column in @model to get numeric IDs for values from
+ *
+ * Sets the model column which @combo_box should use to get numeric IDs
+ * for values from. The column @id_column in the model of @combo_box
+ * must be of type %G_TYPE_INT.
+ *
+ * Since: 3.0
+ */
+void
+gtk_combo_box_set_id_column (GtkComboBox *combo_box,
+                             gint         id_column)
+{
+  GtkComboBoxPrivate *priv = combo_box->priv;
+  GtkTreeModel *model;
+
+  g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
+
+  model = gtk_combo_box_get_model (combo_box);
+
+  g_return_if_fail (id_column >= 0);
+  g_return_if_fail (model == NULL || id_column < gtk_tree_model_get_n_columns (model));
+
+  priv->id_column = id_column;
+}
+
+/**
+ * gtk_combo_box_get_id_column:
+ * @combo_box: A #GtkComboBox
+ *
+ * Returns the column which @combo_box is using to get numeric IDs
+ * for values from.
+ *
+ * Return value: A column in the data source model of @combo_box.
+ *
+ * Since: 3.0
+ */
+gint
+gtk_combo_box_get_id_column (GtkComboBox *combo_box)
+{
+  g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), 0);
+
+  return combo_box->priv->id_column;
+}
+
+gint
+gtk_combo_box_get_active_id (GtkComboBox *combo_box)
+{
+  GtkTreeModel *model;
+  GtkTreeIter iter;
+  gint column;
+
+  g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), 0);
+
+  column = combo_box->priv->id_column;
+  g_return_val_if_fail (column >= 0, 0);
+
+  model = gtk_combo_box_get_model (combo_box);
+  if (gtk_combo_box_get_active_iter (combo_box, &iter))
+    {
+      gint id;
+
+      gtk_tree_model_get (model, &iter, column, &id, -1);
+      return id;
+    }
+
+  return 0;
+}
+
+void
+gtk_combo_box_set_active_id (GtkComboBox *combo_box,
+                             gint         active_id)
+{
+  GtkTreeModel *model;
+  GtkTreeIter iter;
+  gint column;
+  gint id;
+
+  g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
+
+  column = combo_box->priv->id_column;
+  g_return_if_fail (column >= 0);
+
+  model = gtk_combo_box_get_model (combo_box);
+  if (gtk_tree_model_get_iter_first (model, &iter))
+    do {
+      gtk_tree_model_get (model, &iter, column, &id, -1);
+      if (id == active_id)
+        {
+          gtk_combo_box_set_active_iter (combo_box, &iter);
+          break;
+        }
+    } while (gtk_tree_model_iter_next (model, &iter));
+}
+
diff --git a/gtk/gtkcombobox.h b/gtk/gtkcombobox.h
index c5b6a3c..1eef0b6 100644
--- a/gtk/gtkcombobox.h
+++ b/gtk/gtkcombobox.h
@@ -133,6 +133,12 @@ void          gtk_combo_box_popup_for_device (GtkComboBox     *combo_box,
 void          gtk_combo_box_popdown          (GtkComboBox     *combo_box);
 AtkObject*    gtk_combo_box_get_popup_accessible (GtkComboBox *combo_box);
 
+gint          gtk_combo_box_get_id_column        (GtkComboBox *combo_box);
+void          gtk_combo_box_set_id_column        (GtkComboBox *combo_box,
+                                                  gint         id_column);
+gint          gtk_combo_box_get_active_id        (GtkComboBox *combo_box);
+void          gtk_combo_box_set_active_id        (GtkComboBox *combo_box,
+                                                  gint         id);
 
 G_END_DECLS
 
diff --git a/gtk/gtkcomboboxtext.c b/gtk/gtkcomboboxtext.c
index db3a4e8..c0c7c60 100644
--- a/gtk/gtkcomboboxtext.c
+++ b/gtk/gtkcomboboxtext.c
@@ -72,7 +72,7 @@ gtk_combo_box_text_init (GtkComboBoxText *combo_box)
 {
   GtkListStore *store;
 
-  store = gtk_list_store_new (1, G_TYPE_STRING);
+  store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
   gtk_combo_box_set_model (GTK_COMBO_BOX (combo_box), GTK_TREE_MODEL (store));
   g_object_unref (store);
 }
@@ -102,6 +102,7 @@ gtk_combo_box_text_new (void)
 {
   return g_object_new (GTK_TYPE_COMBO_BOX_TEXT,
                        "entry-text-column", 0,
+                       "id-column", 1,
                        NULL);
 }
 
@@ -121,6 +122,7 @@ gtk_combo_box_text_new_with_entry (void)
   return g_object_new (GTK_TYPE_COMBO_BOX_TEXT,
                        "has-entry", TRUE,
                        "entry-text-column", 0,
+                       "id-column", 1,
                        NULL);
 }
 
@@ -171,6 +173,26 @@ gtk_combo_box_text_insert_text (GtkComboBoxText *combo_box,
                                 gint             position,
                                 const gchar     *text)
 {
+}
+
+ /**
+ * gtk_combo_box_text_insert_text_with_id:
+ * @combo_box: A #GtkComboBoxText
+ * @position: An index to insert @text
+ * @text: A string
+ * @id: a numeric ID for this value
+ *
+ * Inserts @string at @position in the list of strings stored in @combo_box,
+ * and sets its numeric ID to @id. See #GtkComboBox::id-column.
+ *
+ * Since: 3.0
+ */
+void
+gtk_combo_box_text_insert_text_with_id (GtkComboBoxText *combo_box,
+                                        gint             position,
+                                        const gchar     *text,
+                                        gint             id)
+{
   GtkListStore *store;
   GtkTreeIter iter;
   gint text_column;
@@ -187,8 +209,12 @@ gtk_combo_box_text_insert_text (GtkComboBoxText *combo_box,
   column_type = gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), text_column);
   g_return_if_fail (column_type == G_TYPE_STRING);
 
+  id_column = gtk_combo_box_get_id_column (GTK_COMBO_BOX (combo_box));
+  column_type = gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), id_column);
+  g_return_if_fail (column_type == G_TYPE_INT);
+
   gtk_list_store_insert (store, &iter, position);
-  gtk_list_store_set (store, &iter, text_column, text, -1);
+  gtk_list_store_set (store, &iter, text_column, text, id_column, id, -1);
 }
 
 /**
diff --git a/gtk/gtkcomboboxtext.h b/gtk/gtkcomboboxtext.h
index 50ebcb5..7322e45 100644
--- a/gtk/gtkcomboboxtext.h
+++ b/gtk/gtkcomboboxtext.h
@@ -72,6 +72,10 @@ void          gtk_combo_box_text_remove          (GtkComboBoxText     *combo_box
 void          gtk_combo_box_text_remove_all      (GtkComboBoxText     *combo_box);
 gchar        *gtk_combo_box_text_get_active_text (GtkComboBoxText     *combo_box);
 
+void          gtk_combo_box_text_insert_text_with_id (GtkComboBoxText     *combo_box,
+                                                      gint                 position,
+                                                      const gchar         *text,
+                                                      gint                 id);
 
 G_END_DECLS
 
