Index: fmultirename.pas
===================================================================
--- fmultirename.pas	(revision 8738)
+++ fmultirename.pas	(working copy)
@@ -996,10 +996,11 @@
 
 procedure TfrmMultiRename.RenameFiles;
 var
-  AFile: TFile;
+  AFile,OFile: TFile;
   NewName: String;
-  I, J, K: Integer;
+  I, J, K, L: Integer;
   OldFiles, NewFiles: TFiles;
+  OldNames: TStringHashList;
   AutoRename: Boolean = False;
   Operation: TFileSourceOperation;
   theNewProperties: TFileProperties;
@@ -1016,11 +1017,29 @@
   NewFiles:= TFiles.Create(EmptyStr);
 
   try
+    // OldNames
+    OldNames:= TStringHashList.Create(True);
+    OldNames.Clear;
+    for I:= 0 to OldFiles.Count -1 do
+      OldNames.Add(OldFiles[I].Name);
+
     FNewNames.Clear;
     for I:= 0 to FFiles.Count - 1 do
     begin
       AFile:= TFile.Create(EmptyStr);
       AFile.Name:= FreshText(I);
+
+      // Avoid collisions with OldNames
+      L:= OldNames.Find(AFile.Name);
+      if L >= 0 then
+      begin
+        // Add @ at end of name
+        if AFile.Extension = '' then
+          AFile.Name:= AFile.NameNoExt + '@'
+        else
+          AFile.Name:= AFile.NameNoExt + '@.' + AFile.Extension;
+      end;
+
       // Checking duplicates
       NewName:= FFiles[I].Path + AFile.Name;
       J:= FNewNames.Find(NewName);
@@ -1073,6 +1092,30 @@
     NewFiles.Free;
   end;
 
+  // Rename files back, remove @
+  for I:= 0 to FFiles.Count - 1 do
+  begin
+    AFile:= TFile.Create(EmptyStr);
+    AFile.Name:= FreshText(I);
+    OFile:= AFile.Clone;
+
+    L:= OldNames.Find(AFile.Name);
+    if L >= 0 then
+    begin
+      if AFile.Extension = '' then
+      begin
+        OFile.Name:= FFiles[I].Path + AFile.NameNoExt + '@';
+        RenameFile(FFileSource, OFile, AFile.NameNoExt, True);
+      end else begin
+        OFile.Name:= FFiles[I].Path + AFile.NameNoExt + '@.' + AFile.Extension;
+        RenameFile(FFileSource, OFile, AFile.NameNoExt + '.' + AFile.Extension, True);
+      end;
+      FFiles[I].Name := AFile.Name;
+    end;
+    AFile.Free;
+    OFile.Free;
+  end;
+
   StringGridTopLeftChanged(StringGrid);
 end;
 
