+--- old/generator.c
++++ new/generator.c
+@@ -90,6 +90,9 @@ extern dev_t filesystem_dev;
+ extern char *backup_dir;
+ extern char *backup_suffix;
+ extern int backup_suffix_len;
++extern char *backup_dir_dels;
++extern char *backup_suffix_dels;
++extern int backup_suffix_dels_len;
+ extern struct file_list *the_file_list;
+ extern struct filter_list_struct server_filter_list;
+
+@@ -100,10 +103,14 @@ static int deletion_count = 0; /* used t
+ #define DEL_TERSE (1<<3)
+
+
++/* Function now compares both backup_suffix and backup_suffix_dels. */
+ static int is_backup_file(char *fn)
+ {
+ int k = strlen(fn) - backup_suffix_len;
+- return k > 0 && strcmp(fn+k, backup_suffix) == 0;
++ if (k > 0 && strcmp(fn+k, backup_suffix) == 0)
++ return 1;
++ k += backup_suffix_len - backup_suffix_dels_len;
++ return k > 0 && strcmp(fn+k, backup_suffix_dels) == 0;
+ }
+
+
+@@ -124,8 +131,8 @@ static int delete_item(char *fname, int
+ if (!S_ISDIR(mode)) {
+ if (max_delete && ++deletion_count > max_delete)
+ return 0;
+- if (make_backups && (backup_dir || !is_backup_file(fname)))
+- ok = make_backup(fname);
++ if (make_backups && (backup_dir_dels || !is_backup_file(fname)))
++ ok = safe_delete(fname);
+ else
+ ok = robust_unlink(fname) == 0;
+ if (ok) {
+@@ -147,9 +154,9 @@ static int delete_item(char *fname, int
+ || (dry_run && zap_dir)) {
+ ok = 0;
+ errno = ENOTEMPTY;
+- } else if (make_backups && !backup_dir && !is_backup_file(fname)
++ } else if (make_backups && !backup_dir_dels && !is_backup_file(fname)
+ && !(flags & DEL_FORCE_RECURSE))
+- ok = make_backup(fname);
++ ok = safe_delete(fname);
+ else
+ ok = do_rmdir(fname) == 0;
+ if (ok) {
+--- old/options.c
++++ new/options.c
+@@ -138,10 +138,14 @@ int no_detach