diff --git a/gtk/gtkprinteroptionwidget.c b/gtk/gtkprinteroptionwidget.c
index 413b828..9c1ff9d 100644
--- a/gtk/gtkprinteroptionwidget.c
+++ b/gtk/gtkprinteroptionwidget.c
@@ -374,18 +374,18 @@ combo_box_get (GtkWidget *combo)
   gchar *value;
   GtkTreeIter iter;
 
-  if (GTK_IS_COMBO_BOX_ENTRY (combo))
+  model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
+
+  value = NULL;
+  if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter))
     {
-      value = gtk_combo_box_get_active_text(GTK_COMBO_BOX (combo));
+      gtk_tree_model_get (model, &iter, VALUE_COLUMN, &value, -1);
     }
   else
     {
-      model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
-
-      value = NULL;
-      if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter))
-         gtk_tree_model_get (model, &iter, VALUE_COLUMN, &value, -1);
-     }
+      if (GTK_IS_COMBO_BOX_ENTRY (combo))
+        value = gtk_combo_box_get_active_text(GTK_COMBO_BOX (combo));
+    }
 
   return value;
 }
@@ -870,6 +870,22 @@ update_widgets (GtkPrinterOptionWidget *widget)
     case GTK_PRINTER_OPTION_TYPE_STRING:
       gtk_entry_set_text (GTK_ENTRY (priv->entry), source->value);
       break;
+    case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD:
+    case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE:
+    case GTK_PRINTER_OPTION_TYPE_PICKONE_REAL:
+    case GTK_PRINTER_OPTION_TYPE_PICKONE_INT:
+    case GTK_PRINTER_OPTION_TYPE_PICKONE_STRING:
+      {
+        GtkEntry *entry;
+
+        entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->combo)));
+        if (gtk_printer_option_has_choice (source, source->value))
+          combo_box_set (priv->combo, source->value);
+        else
+          gtk_entry_set_text (entry, source->value);
+
+        break;
+      }
     case GTK_PRINTER_OPTION_TYPE_FILESAVE:
       {
         gchar *filename = g_filename_from_uri (source->value, NULL, NULL);
diff --git a/modules/printbackends/cups/gtkprintbackendcups.c b/modules/printbackends/cups/gtkprintbackendcups.c
index 1161618..b644115 100644
--- a/modules/printbackends/cups/gtkprintbackendcups.c
+++ b/modules/printbackends/cups/gtkprintbackendcups.c
@@ -3723,7 +3723,27 @@ cups_printer_get_options (GtkPrinter           *printer,
       name = get_option_name (opts[i].name);
       option = gtk_printer_option_set_lookup (set, name);
       if (option)
-        gtk_printer_option_set (option, opts[i].value);
+        {
+          /* We need to remove the Custom. string from PICKONE_* option types. */
+          char *customvalue;
+          switch (option->type)
+            {
+            case GTK_PRINTER_OPTION_TYPE_PICKONE_INT:
+            case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE:
+            case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD:
+            case GTK_PRINTER_OPTION_TYPE_PICKONE_REAL:
+            case GTK_PRINTER_OPTION_TYPE_PICKONE_STRING:
+              if (g_str_has_prefix (opts[i].value, "Custom."))
+                customvalue = opts[i].value + 7;
+              else
+                customvalue = opts[i].value;
+
+              gtk_printer_option_set (option, customvalue);
+              break;
+            default:
+              gtk_printer_option_set (option, opts[i].value);
+            }
+        }
       g_free (name);
     }
 
@@ -4083,7 +4103,27 @@ set_option_from_settings (GtkPrinterOption *option,
     {
       cups_value = gtk_print_settings_get (settings, option->name);
       if (cups_value)
-	gtk_printer_option_set (option, cups_value);
+        {
+          /* We need to remove the Custom. string from PICKONE_* option types. */
+          const gchar *customvalue;
+          switch (option->type)
+            {
+            case GTK_PRINTER_OPTION_TYPE_PICKONE_INT:
+            case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE:
+            case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD:
+            case GTK_PRINTER_OPTION_TYPE_PICKONE_REAL:
+            case GTK_PRINTER_OPTION_TYPE_PICKONE_STRING:
+              if (g_str_has_prefix (cups_value, "Custom."))
+                customvalue = cups_value + 7;
+              else
+                customvalue = cups_value;
+
+              gtk_printer_option_set (option, customvalue);
+              break;
+            default:
+              gtk_printer_option_set (option, cups_value);
+            }
+        }
     } 
 }
 
@@ -4148,7 +4188,29 @@ foreach_option_get_settings (GtkPrinterOption *option,
   else if (strcmp (option->name, "gtk-print-time-text") == 0)
     gtk_print_settings_set (settings, "print-at-time", value);
   else if (g_str_has_prefix (option->name, "cups-"))
-    gtk_print_settings_set (settings, option->name, value);
+    {
+      char *customvalue = NULL;
+
+      switch (option->type)
+        {
+        case GTK_PRINTER_OPTION_TYPE_PICKONE_INT:
+        case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE:
+        case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD:
+        case GTK_PRINTER_OPTION_TYPE_PICKONE_REAL:
+        case GTK_PRINTER_OPTION_TYPE_PICKONE_STRING:
+          if (!gtk_printer_option_has_choice (option, value))
+            {
+              customvalue = g_strconcat("Custom.", value, NULL);
+              gtk_print_settings_set (settings, option->name, customvalue);
+              g_free (customvalue);
+              break;
+            }
+          /* else fall trough */
+        default:
+          gtk_print_settings_set (settings, option->name, value);
+          break;
+        }
+    }
 }
 
 static gboolean
