Index: app/dialogs/image-new-dialog.c
===================================================================
--- app/dialogs/image-new-dialog.c	(revision 27080)
+++ app/dialogs/image-new-dialog.c	(working copy)
@@ -64,15 +64,18 @@ typedef struct
 
 /*  local function prototypes  */
 
-static void   image_new_dialog_free      (ImageNewDialog *dialog);
-static void   image_new_dialog_response  (GtkWidget      *widget,
-                                          gint            response_id,
-                                          ImageNewDialog *dialog);
-static void   image_new_template_changed (GimpContext    *context,
-                                          GimpTemplate   *template,
-                                          ImageNewDialog *dialog);
-static void   image_new_confirm_dialog   (ImageNewDialog *dialog);
-static void   image_new_create_image     (ImageNewDialog *dialog);
+static void     image_new_dialog_free        (ImageNewDialog *dialog);
+static void     image_new_dialog_response    (GtkWidget      *widget,
+                                              gint            response_id,
+                                              ImageNewDialog *dialog);
+static void     image_new_template_changed   (GimpContext    *context,
+                                              GimpTemplate   *template,
+                                              ImageNewDialog *dialog);
+static void     image_new_confirm_dialog     (ImageNewDialog *dialog);
+static void     image_new_create_image       (ImageNewDialog *dialog);
+static gboolean image_new_dialog_config_sync (GObject        *src,
+                                              GObject        *dest,
+                                              GParamFlags     flags);
 
 
 /*  public functions  */
@@ -245,7 +248,15 @@ image_new_template_changed (GimpContext 
   if (!template->comment || !strlen (template->comment))
     comment = g_strdup (dialog->template->comment);
 
+  /* The mess of complex interdependencies and dubious signal
+   * emissions makes gimp_config_sync() not work. Instead, use a local
+   * version of gimp_config_sync() that is identical but without the
+   * notify freezes.
   gimp_config_sync (G_OBJECT (template), G_OBJECT (dialog->template), 0);
+   */
+  image_new_dialog_config_sync (G_OBJECT (template),
+                                G_OBJECT (dialog->template),
+                                0);
 
   if (comment)
     {
@@ -342,3 +353,163 @@ image_new_create_image (ImageNewDialog *
 
   g_object_unref (template);
 }
+
+
+#ifdef __GNUC__
+#warning FIXME: image_new_dialog_config_diff_other(), \
+  image_new_dialog_config_diff_property(), image_new_dialog_config_diff_same() \
+  and image_new_dialog_config_sync() are copies from gimpconfig.c. \
+  See bug 546924.
+#endif
+
+static gboolean
+image_new_dialog_config_diff_property (GObject    *a,
+                                       GObject    *b,
+                                       GParamSpec *prop_spec)
+{
+  GValue    a_value = { 0, };
+  GValue    b_value = { 0, };
+  gboolean  retval  = FALSE;
+
+  g_value_init (&a_value, prop_spec->value_type);
+  g_value_init (&b_value, prop_spec->value_type);
+
+  g_object_get_property (a, prop_spec->name, &a_value);
+  g_object_get_property (b, prop_spec->name, &b_value);
+
+  if (g_param_values_cmp (prop_spec, &a_value, &b_value))
+    {
+      if ((prop_spec->flags & GIMP_CONFIG_PARAM_AGGREGATE) &&
+          G_IS_PARAM_SPEC_OBJECT (prop_spec)               &&
+          g_type_interface_peek (g_type_class_peek (prop_spec->value_type),
+                                 GIMP_TYPE_CONFIG))
+        {
+          if (! gimp_config_is_equal_to (g_value_get_object (&a_value),
+                                         g_value_get_object (&b_value)))
+            {
+              retval = TRUE;
+            }
+        }
+      else
+        {
+          retval = TRUE;
+        }
+    }
+
+  g_value_unset (&a_value);
+  g_value_unset (&b_value);
+
+  return retval;
+}
+
+static GList *
+image_new_dialog_config_diff_same (GObject     *a,
+                                   GObject     *b,
+                                   GParamFlags  flags)
+{
+  GParamSpec **param_specs;
+  guint        n_param_specs;
+  gint         i;
+  GList       *list = NULL;
+
+  param_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (a),
+                                                &n_param_specs);
+
+  for (i = 0; i < n_param_specs; i++)
+    {
+      GParamSpec *prop_spec = param_specs[i];
+
+      if (! flags || ((prop_spec->flags & flags) == flags))
+        {
+          if (image_new_dialog_config_diff_property (a, b, prop_spec))
+            list = g_list_prepend (list, prop_spec);
+        }
+    }
+
+  g_free (param_specs);
+
+  return list;
+}
+
+static GList *
+image_new_dialog_config_diff_other (GObject     *a,
+                                    GObject     *b,
+                                    GParamFlags  flags)
+{
+  GParamSpec **param_specs;
+  guint        n_param_specs;
+  gint         i;
+  GList       *list = NULL;
+
+  param_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (a),
+                                                &n_param_specs);
+
+  for (i = 0; i < n_param_specs; i++)
+    {
+      GParamSpec *a_spec = param_specs[i];
+      GParamSpec *b_spec = g_object_class_find_property (G_OBJECT_GET_CLASS (b),
+                                                         a_spec->name);
+
+      if (b_spec &&
+          (a_spec->value_type == b_spec->value_type) &&
+          (! flags || (a_spec->flags & b_spec->flags & flags) == flags))
+        {
+          if (image_new_dialog_config_diff_property (a, b, b_spec))
+            list = g_list_prepend (list, b_spec);
+        }
+    }
+
+  g_free (param_specs);
+
+  return list;
+}
+
+/**
+ * image_new_dialog_config_sync:
+ *
+ * Identical to gimp_config_sync() except the notify freezes.
+ */
+static gboolean
+image_new_dialog_config_sync (GObject     *src,
+                              GObject     *dest,
+                              GParamFlags  flags)
+{
+  GList *diff;
+  GList *list;
+
+  g_return_val_if_fail (G_IS_OBJECT (src), FALSE);
+  g_return_val_if_fail (G_IS_OBJECT (dest), FALSE);
+
+  /* we use the internal versions here for a number of reasons:
+   *  - it saves a g_list_reverse()
+   *  - it avoids duplicated parameter checks
+   */
+  if (G_TYPE_FROM_INSTANCE (src) == G_TYPE_FROM_INSTANCE (dest))
+    diff = image_new_dialog_config_diff_same (src, dest, (flags | G_PARAM_READWRITE));
+  else
+    diff = image_new_dialog_config_diff_other (src, dest, flags);
+
+  if (!diff)
+    return FALSE;
+
+  for (list = diff; list; list = list->next)
+    {
+      GParamSpec *prop_spec = list->data;
+
+      if (! (prop_spec->flags & G_PARAM_CONSTRUCT_ONLY))
+        {
+          GValue value = { 0, };
+
+          g_value_init (&value, prop_spec->value_type);
+
+          g_object_get_property (src,  prop_spec->name, &value);
+          g_object_set_property (dest, prop_spec->name, &value);
+
+          g_value_unset (&value);
+        }
+    }
+
+  g_list_free (diff);
+
+  return TRUE;
+}
Index: libgimpconfig/gimpconfig-utils.c
===================================================================
--- libgimpconfig/gimpconfig-utils.c	(revision 27080)
+++ libgimpconfig/gimpconfig-utils.c	(working copy)
@@ -206,7 +206,6 @@ gimp_config_sync (GObject     *src,
   /* we use the internal versions here for a number of reasons:
    *  - it saves a g_list_reverse()
    *  - it avoids duplicated parameter checks
-   *  - it makes GimpTemplateEditor work (resolution is set before size)
    */
   if (G_TYPE_FROM_INSTANCE (src) == G_TYPE_FROM_INSTANCE (dest))
     diff = gimp_config_diff_same (src, dest, (flags | G_PARAM_READWRITE));
