diff --git a/hgext/convert/filemap.py b/hgext/convert/filemap.py
--- a/hgext/convert/filemap.py
+++ b/hgext/convert/filemap.py
@@ -348,12 +348,13 @@ class filemap_source(converter_source):
         # original filename in the rev part of the return value.
         changes, copies = self.base.getchanges(rev)
         newnames = {}
-        files = []
+        files = {}
         for f, r in changes:
             newf = self.filemapper(f)
-            if newf:
-                files.append((newf, (f, r)))
+            if newf and (newf != f or newf not in files):
+                files[newf] = (f, r)
                 newnames[f] = newf
+        files = sorted(files.items())
 
         ncopies = {}
         for c in copies:
diff --git a/tests/test-convert-filemap.t b/tests/test-convert-filemap.t
--- a/tests/test-convert-filemap.t
+++ b/tests/test-convert-filemap.t
@@ -375,3 +375,36 @@ exercise incremental conversion at the s
   |
   o  0 "addb" files: b
   
+
+filemap rename undoing revision rename
+
+  $ hg init renameundo
+  $ cd renameundo
+  $ echo 1 > a
+  $ echo 1 > c
+  $ hg ci -qAm add
+  $ hg mv -q a b/a
+  $ hg mv -q c b/c
+  $ hg ci -qm rename
+  $ echo 2 > b/a
+  $ echo 2 > b/c
+  $ hg ci -qm modify
+  $ cd ..
+
+  $ echo "rename b ." > renameundo.fmap
+  $ hg convert --filemap renameundo.fmap renameundo renameundo2
+  initializing destination renameundo2 repository
+  scanning source...
+  sorting...
+  converting...
+  2 add
+  1 rename
+  filtering out empty revision
+  repository tip rolled back to revision 0 (undo commit)
+  0 modify
+  $ glog -R renameundo2
+  o  1 "modify" files: a c
+  |
+  o  0 "add" files: a c
+  
+