diff --git a/gio/gsettings.c b/gio/gsettings.c
index 2b1c161..0249ece 100644
--- a/gio/gsettings.c
+++ b/gio/gsettings.c
@@ -237,6 +237,7 @@ struct _GSettingsPrivate
   GSettingsSchema *schema;
   gchar *schema_name;
   gchar *path;
+  gboolean try_new;
 
   GDelayedSettingsBackend *delayed;
 };
@@ -248,7 +249,8 @@ enum
   PROP_BACKEND,
   PROP_PATH,
   PROP_HAS_UNAPPLIED,
-  PROP_DELAY_APPLY
+  PROP_DELAY_APPLY,
+  TRY_NEW
 };
 
 enum
@@ -445,6 +447,9 @@ g_settings_set_property (GObject      *object,
       settings->priv->backend = g_value_dup_object (value);
       break;
 
+    case PROP_TRY_NEW:
+      settings->priv->try_new = g_value_get_boolean (value);
+      break;
     default:
       g_assert_not_reached ();
     }
@@ -480,6 +485,10 @@ g_settings_get_property (GObject    *object,
       g_value_set_boolean (value, settings->priv->delayed != NULL);
       break;
 
+    case PROP_TRY_NEW:
+      g_value_set_boolean (value, settings->priv->try_new);
+      break;
+
      default:
       g_assert_not_reached ();
     }
@@ -499,8 +508,15 @@ g_settings_constructed (GObject *object)
   GSettings *settings = G_SETTINGS (object);
   const gchar *schema_path;
 
-  settings->priv->schema = g_settings_schema_new (settings->priv->schema_name);
+  if(settings->priv->try_new == FALSE)
+    settings->priv->schema = g_settings_schema_new (settings->priv->schema_name);
+  else
+    {
+      settings->priv->schema = g_settings_schema_try_new (settings->priv->schema_name);
+      return NULL;
+    }
   schema_path = g_settings_schema_get_path (settings->priv->schema);
+      
 
   if (settings->priv->path && schema_path && strcmp (settings->priv->path, schema_path) != 0)
     g_error ("settings object created with schema '%s' and path '%s', but "
@@ -550,6 +566,7 @@ g_settings_init (GSettings *settings)
                                                 GSettingsPrivate);
 
   settings->priv->main_context = g_main_context_get_thread_default ();
+  settings->priv->try_new = FALSE;
 
   if (settings->priv->main_context == NULL)
     settings->priv->main_context = g_main_context_default ();
@@ -744,6 +761,18 @@ g_settings_class_init (GSettingsClass *class)
                            P_("Whether this settings object is in 'delay-apply' mode"),
                            FALSE,
                            G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+   /**
+    * GSettings:try-new:
+    *
+    * If this property is %TRUE, #GSettings object will not abort
+    * if the schema is missing
+    */
+   g_object_class_install_property (object_class, PROP_TRY_NEW,
+     g_param_spec_boolean ("try-new",
+                           P_("Try-New mode"),
+                           P_("TRUE if the program don't abort on missing schema"),
+                           FALSE,
+                           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 /* Construction (new, new_with_path, etc.) {{{1 */
@@ -772,6 +801,33 @@ g_settings_new (const gchar *schema)
 }
 
 /**
+ * g_settings_try_new:
+ * @schema: the name of the schema
+ * @returns: a new #GSettings object or NULL if the schema is missing
+ *
+ * Creates a new #GSettings object with a given schema.
+ *
+ * Signals on the newly created #GSettings object will be dispatched
+ * via the thread-default #GMainContext in effect at the time of the
+ * call to g_settings_new().  The new #GSettings will hold a reference
+ * on the context.  See g_main_context_push_thread_default().
+ *
+ * @note Should be used carefully and only for plugin like hierarchy programs
+ *
+ * Since: 2.30
+ */
+GSettings *
+g_settings_try_new (const gchar *schema)
+{
+  g_return_val_if_fail (schema != NULL, NULL);
+
+  return g_object_new (G_TYPE_SETTINGS,
+                       "schema", schema,
+                       "try-new", TRUE,
+                       NULL);
+}
+
+/**
  * g_settings_new_with_path:
  * @schema: the name of the schema
  * @path: the path to use
diff --git a/gio/gsettings.h b/gio/gsettings.h
index 8db2f75..8f7c66d 100644
--- a/gio/gsettings.h
+++ b/gio/gsettings.h
@@ -73,6 +73,7 @@ GType                   g_settings_get_type                             (void);
 const gchar * const *   g_settings_list_schemas                         (void);
 const gchar * const *   g_settings_list_relocatable_schemas             (void);
 GSettings *             g_settings_new                                  (const gchar        *schema);
+GSettings *             g_settings_try_new                              (const gchar        *schema);
 GSettings *             g_settings_new_with_path                        (const gchar        *schema,
                                                                          const gchar        *path);
 GSettings *             g_settings_new_with_backend                     (const gchar        *schema,
diff --git a/gio/gsettingsschema.c b/gio/gsettingsschema.c
index 77eb119..d34c5d2 100644
--- a/gio/gsettingsschema.c
+++ b/gio/gsettingsschema.c
@@ -296,6 +296,45 @@ g_settings_schema_new (const gchar *name)
   return schema;
 }
 
+GSettingsSchema *
+g_settings_schema_try_new (const gchar *name)
+{
+  GSettingsSchema *schema;
+  GvdbTable *table = NULL;
+  GSList *source;
+
+  g_return_val_if_fail (name != NULL, NULL);
+
+  initialise_schema_sources ();
+
+  for (source = schema_sources; source; source = source->next)
+    {
+      GvdbTable *file = source->data;
+
+      if ((table = gvdb_table_get_table (file, name)))
+        break;
+    }
+
+  if (table == NULL)
+    {
+      g_critical ("Settings schema '%s' is not installed\n", name);
+      return NULL;
+    }
+
+  schema = g_object_new (G_TYPE_SETTINGS_SCHEMA, NULL);
+  schema->priv->name = g_strdup (name);
+  schema->priv->table = table;
+  schema->priv->path =
+    g_settings_schema_get_string (schema, ".path");
+  schema->priv->gettext_domain =
+    g_settings_schema_get_string (schema, ".gettext-domain");
+
+  if (schema->priv->gettext_domain)
+    bind_textdomain_codeset (schema->priv->gettext_domain, "UTF-8");
+
+  return schema;
+}
+
 GVariantIter *
 g_settings_schema_get_value (GSettingsSchema *schema,
                              const gchar     *key)
diff --git a/gio/gsettingsschema.h b/gio/gsettingsschema.h
index 31ba1f4..c651190 100644
--- a/gio/gsettingsschema.h
+++ b/gio/gsettingsschema.h
@@ -57,6 +57,8 @@ GType                   g_settings_schema_get_type                      (void);
 G_GNUC_INTERNAL
 GSettingsSchema *       g_settings_schema_new                           (const gchar      *name);
 G_GNUC_INTERNAL
+GSettingsSchema *       g_settings_schema_try_new                       (const gchar      *name);
+G_GNUC_INTERNAL
 const gchar *           g_settings_schema_get_path                      (GSettingsSchema  *schema);
 G_GNUC_INTERNAL
 const gchar *           g_settings_schema_get_gettext_domain            (GSettingsSchema  *schema);
