diff --git a/src/migration.c b/src/migration.c
index 72b79d76..e3ae04b1 100644
--- a/src/migration.c
+++ b/src/migration.c
@@ -386,7 +386,7 @@ migrate_profile (TerminalSettingsList *list,
     settings = terminal_settings_list_ref_default_child (list);
     is_default = TRUE;
   } else {
-    child_name = terminal_settings_list_add_child (list);
+    child_name = terminal_settings_list_add_child (list, NULL);
     settings = terminal_settings_list_ref_child (list, child_name);
     g_free (child_name);
     is_default = FALSE;
diff --git a/src/terminal-app.c b/src/terminal-app.c
index 86a516a0..8f44b6b3 100644
--- a/src/terminal-app.c
+++ b/src/terminal-app.c
@@ -315,25 +315,17 @@ terminal_app_new_profile (TerminalApp *app,
                           GSettings   *base_profile,
                           const char  *name)
 {
-  gs_unref_object GSettings *profile = NULL;
   char *uuid;
 
   if (base_profile) {
     gs_free char *base_uuid;
 
     base_uuid = terminal_settings_list_dup_uuid_from_child (app->profiles_list, base_profile);
-    uuid = terminal_settings_list_clone_child (app->profiles_list, base_uuid);
+    uuid = terminal_settings_list_clone_child (app->profiles_list, base_uuid, name);
   } else {
-    uuid = terminal_settings_list_add_child (app->profiles_list);
+    uuid = terminal_settings_list_add_child (app->profiles_list, name);
   }
 
-  if (uuid == NULL)
-    return NULL;
-
-  profile = terminal_settings_list_ref_child (app->profiles_list, uuid);
-
-  g_settings_set_string (profile, TERMINAL_PROFILE_VISIBLE_NAME_KEY, name);
-
   return uuid;
 }
 
diff --git a/src/terminal-prefs.c b/src/terminal-prefs.c
index e0e28d54..41441198 100644
--- a/src/terminal-prefs.c
+++ b/src/terminal-prefs.c
@@ -187,10 +187,6 @@ profile_new_now (const char *name)
 {
   gs_free char *uuid = terminal_app_new_profile (terminal_app_get (), NULL, name);
 
-  // FIXME terminal_app_new_profile() first creates the new profile with empty name,
-  // adds it to the list (which triggers sorting) and then sets the name. So we need to
-  // re-sort. Ideally it should create the new profile with the new name straight away.
-  gtk_list_box_invalidate_sort (the_pref_data->listbox);
   listbox_select_profile (uuid);
 }
 
@@ -203,10 +199,6 @@ profile_clone_now (const char *name)
 
   gs_free char *uuid = terminal_app_new_profile (terminal_app_get (), the_pref_data->selected_profile, name);
 
-  // FIXME terminal_app_new_profile() first creates the new profile with the cloned name,
-  // adds it to the list (which triggers sorting) and then sets the name. So we need to
-  // re-sort. Ideally it should create the new profile with the new name straight away.
-  gtk_list_box_invalidate_sort (the_pref_data->listbox);
   listbox_select_profile (uuid);
 }
 
@@ -523,9 +515,9 @@ listbox_create_row (const char *name,
   // intermittently at random places. Give it another try.
   GMenu *model = g_menu_new ();
   GMenu *model_section = g_menu_new ();
-  g_menu_append (model_section, _("_Clone…"), "win.clone");
-  g_menu_append (model_section, _("_Rename…"), "win.rename");
-  g_menu_append (model_section, _("_Delete…"), "win.delete");
+  g_menu_append (model_section, _("Clone…"), "win.clone");
+  g_menu_append (model_section, _("Rename…"), "win.rename");
+  g_menu_append (model_section, _("Delete…"), "win.delete");
   g_menu_append_section (model, NULL, G_MENU_MODEL (model_section));
 
   model_section = g_menu_new ();
diff --git a/src/terminal-settings-list.c b/src/terminal-settings-list.c
index cdc80b6b..e5949b2a 100644
--- a/src/terminal-settings-list.c
+++ b/src/terminal-settings-list.c
@@ -270,9 +270,25 @@ terminal_settings_list_ref_child_internal (TerminalSettingsList *list,
   return g_object_ref (child);
 }
 
+static char *
+new_child (TerminalSettingsList *list,
+           const char *name)
+{
+  char *new_uuid = new_list_entry ();
+
+  if (name != NULL) {
+    gs_free char *new_path = path_new (list, new_uuid);
+    gs_unref_object GSettings *child = g_settings_new_with_path (list->child_schema_id, new_path);
+    g_settings_set_string (child, TERMINAL_PROFILE_VISIBLE_NAME_KEY, name);
+  }
+
+  return new_uuid;
+}
+
 static char *
 clone_child (TerminalSettingsList *list,
-             const char *uuid)
+             const char *uuid,
+             const char *name)
 {
   char *new_uuid;
   gs_free char *path;
@@ -305,7 +321,6 @@ clone_child (TerminalSettingsList *list,
 
     rkey = g_strconcat (path, keys[i], NULL);
     value = dconf_client_read (client, rkey);
-
     if (value) {
       gs_free char *wkey;
       wkey = g_strconcat (new_path, keys[i], NULL);
@@ -313,6 +328,16 @@ clone_child (TerminalSettingsList *list,
     }
   }
 
+  if (name != NULL) {
+    GVariant *value;
+    value = g_variant_new_string (name);
+    if (value) {
+      gs_free char *wkey;
+      wkey = g_strconcat (new_path, TERMINAL_PROFILE_VISIBLE_NAME_KEY, NULL);
+      dconf_changeset_set (changeset, wkey, value);
+    }
+  }
+
   dconf_client_change_sync (client, changeset, NULL, NULL, NULL);
   dconf_changeset_unref (changeset);
 
@@ -321,15 +346,16 @@ clone_child (TerminalSettingsList *list,
 
 static char *
 terminal_settings_list_add_child_internal (TerminalSettingsList *list,
-                                           const char *uuid)
+                                           const char *uuid,
+                                           const char *name)
 {
   char *new_uuid;
   gs_strfreev char **new_uuids;
 
   if (uuid && settings_backend_is_dconf ())
-    new_uuid = clone_child (list, uuid);
+    new_uuid = clone_child (list, uuid, name);
   else
-    new_uuid = new_list_entry ();
+    new_uuid = new_child (list, name);
 
   _terminal_debug_print (TERMINAL_DEBUG_SETTINGS_LIST,
                          "%s NEW UUID %s\n", G_STRFUNC, new_uuid);
@@ -762,23 +788,26 @@ terminal_settings_list_ref_default_child (TerminalSettingsList *list)
 /**
  * terminal_settings_list_add_child:
  * @list: a #TerminalSettingsList
+ * @name: the name of the new profile
  *
  * Adds a new child to the list, and returns a reference to its #GSettings.
  *
  * Returns: (transfer full): the UUID of new child
  */
 char *
-terminal_settings_list_add_child (TerminalSettingsList *list)
+terminal_settings_list_add_child (TerminalSettingsList *list,
+                                  const char *name)
 {
   g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), NULL);
 
-  return terminal_settings_list_add_child_internal (list, NULL);
+  return terminal_settings_list_add_child_internal (list, NULL, name);
 }
 
 /**
  * terminal_settings_list_clone_child:
  * @list: a #TerminalSettingsList
  * @uuid: the UUID of the child to clone
+ * @name: the name of the new child
  *
  * Adds a new child to the list, and returns a reference to its #GSettings.
  * All keys of the new child will have the same value as @uuid's.
@@ -787,12 +816,13 @@ terminal_settings_list_add_child (TerminalSettingsList *list)
  */
 char *
 terminal_settings_list_clone_child (TerminalSettingsList *list,
-                                    const char *uuid)
+                                    const char *uuid,
+                                    const char *name)
 {
   g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), NULL);
   g_return_val_if_fail (terminal_settings_list_valid_uuid (uuid), NULL);
 
-  return terminal_settings_list_add_child_internal (list, uuid);
+  return terminal_settings_list_add_child_internal (list, uuid, name);
 }
 
 /**
diff --git a/src/terminal-settings-list.h b/src/terminal-settings-list.h
index c68c499e..ecf89500 100644
--- a/src/terminal-settings-list.h
+++ b/src/terminal-settings-list.h
@@ -51,10 +51,12 @@ gboolean terminal_settings_list_has_child (TerminalSettingsList *list,
 GSettings *terminal_settings_list_ref_child (TerminalSettingsList *list,
                                              const char *uuid);
 
-char *terminal_settings_list_add_child (TerminalSettingsList *list);
+char *terminal_settings_list_add_child (TerminalSettingsList *list,
+                                        const char *name);
 
 char *terminal_settings_list_clone_child (TerminalSettingsList *list,
-                                          const char *uuid);
+                                          const char *uuid,
+                                          const char *name);
 
 void terminal_settings_list_remove_child (TerminalSettingsList *list,
                                           const char *uuid);
