diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c
index bb06540..f5d3a76 100644
--- a/libnautilus-private/nautilus-file-operations.c
+++ b/libnautilus-private/nautilus-file-operations.c
@@ -5804,19 +5804,13 @@ create_job (GIOSchedulerJob *io_job,
 		filename_is_utf8 = g_utf8_validate (filename, -1, NULL);		
 	}
 	if (filename == NULL) {
-		if (job->make_dir) {
-			/* localizers: the initial name of a new folder  */
-			filename = g_strdup (_("untitled folder"));
+		if (job->make_dir || job->src == NULL) {
+			/* localizers: the initial name of a new file or folder  */
+			filename = g_strdup (_("Untitled"));
 			filename_is_utf8 = TRUE; /* Pass in utf8 */
 		} else {
-			if (job->src != NULL) {
-				filename = g_file_get_basename (job->src);
-			}
-			if (filename == NULL) {
-				/* localizers: the initial name of a new empty file */
-				filename = g_strdup (_("new file"));
-				filename_is_utf8 = TRUE; /* Pass in utf8 */
-			}
+			/* destination name based on source file */
+			filename = g_file_get_basename (job->src);
 		}
 	} 
 
@@ -5893,57 +5887,18 @@ create_job (GIOSchedulerJob *io_job,
 
 			g_assert (dest_fs_type == NULL);
 			dest_fs_type = query_fs_type (job->dest_dir, common->cancellable);
-
-			g_object_unref (dest);
-
-			if (count == 1) {
-				new_filename = g_strdup (filename);
-			} else if (job->make_dir) {
-				filename2 = g_strdup_printf ("%s %d", filename, count);
-
-				new_filename = NULL;
-				if (max_length > 0 && strlen (filename2) > max_length) {
-					new_filename = shorten_utf8_string (filename2, strlen (filename2) - max_length);
-				}
-
-				if (new_filename == NULL) {
-					new_filename = g_strdup (filename2);
-				}
-
-				g_free (filename2);
-			} else {
-				new_filename = get_duplicate_name (filename, count, max_length);
-			}
-
-			if (make_file_name_valid_for_dest_fs (new_filename, dest_fs_type)) {
-				g_object_unref (dest);
-
-				if (filename_is_utf8) {
-					dest = g_file_get_child_for_display_name (job->dest_dir, new_filename, NULL);
-				}
-				if (dest == NULL) {
-					dest = g_file_get_child (job->dest_dir, new_filename);
-				}
-
-				g_free (new_filename);
-				g_error_free (error);
-				goto retry;
-			}
-			g_free (new_filename);
-		} else if (IS_IO_ERROR (error, EXISTS)) {
+		}
+		if (IS_IO_ERROR (error, EXISTS) ||
+		    (IS_IO_ERROR (error, INVALID_FILENAME) && !handled_invalid_filename)) {
 			g_object_unref (dest);
 			dest = NULL;
-			if (job->make_dir) {
-				filename2 = g_strdup_printf ("%s %d", filename, ++count);
-				if (max_length > 0 && strlen (filename2) > max_length) {
-					new_filename = shorten_utf8_string (filename2, strlen (filename2) - max_length);
-					if (new_filename != NULL) {
-						g_free (filename2);
-						filename2 = new_filename;
-					}
+			filename2 = g_strdup_printf (_("Untitled %d"), ++count);
+			if (max_length > 0 && strlen (filename2) > max_length) {
+				new_filename = shorten_utf8_string (filename2, strlen (filename2) - max_length);
+				if (new_filename != NULL) {
+					g_free (filename2);
+					filename2 = new_filename;
 				}
-			} else {
-				filename2 = get_duplicate_name (filename, count++, max_length);
 			}
 			make_file_name_valid_for_dest_fs (filename2, dest_fs_type);
 			if (filename_is_utf8) {
@@ -5955,9 +5910,7 @@ create_job (GIOSchedulerJob *io_job,
 			g_free (filename2);
 			g_error_free (error);
 			goto retry;
-		}
-		
-		else if (IS_IO_ERROR (error, CANCELLED)) {
+		} else if (IS_IO_ERROR (error, CANCELLED)) {
 			g_error_free (error);
 		}
 		
