Index: scmtools/cvs.py
===================================================================
--- scmtools/cvs.py	(revision 1503)
+++ scmtools/cvs.py	(working copy)
@@ -142,6 +142,9 @@
                 os.rmdir(self.tempdir)
 
     def cat_file(self, filename, revision):
+        return self.cat_file_inner(filename, revision, 1)
+
+    def cat_file_inner(self, filename, revision, tryAttic):
         # Somehow CVS sometimes seems to write .cvsignore files to current
         # working directory even though we force stdout with -p.
         self.tempdir = tempfile.mkdtemp()
@@ -185,9 +188,34 @@
         if not errmsg or \
            errmsg.startswith('cvs checkout: cannot find module') or \
            errmsg.startswith('cvs checkout: could not read RCS file'):
-            self.cleanup()
-            raise FileNotFoundError(filename, revision)
+           
+           # If the file could not be found, we search it within or outside the Attic
+           if tryAttic:
+              # Repository on a unix-like machine with Attic
+              if "/Attic/" in filename:
+                 # If the file could not be found, we will try to find it 
+                 # outside the Attic if it was in there
+                 newFilename = filename.replace("/Attic/", "/")
+              # Repository on a windows-like machine with Attic
+              elif "\\Attic\\" in filename:
+                 newFilename = filename.replace("\\Attic\\", "\\")
+              # Repository on a unix-like machine without Attic
+              elif "/" in filename: 
+                 # Try to find the file in the Attic if it was outside
+                 atticPos = filename.rfind("/")
+                 newFilename = filename[0:atticPos] + "/Attic" + filename[atticPos:len(filename)]
+              # Repository on a windows-like machine without Attic
+              elif "\\" in filename: 
+                 # Try to find the file in the Attic if it was outside
+                 atticPos = filename.rfind("\\")
+                 newFilename = filename[0:atticPos] + "\\Attic" + filename[atticPos:len(filename)]
 
+              # Try again with the new filename
+              return self.cat_file_inner(newFilename, revision, 0)
+
+           self.cleanup()
+           raise FileNotFoundError(filename, revision) 
+
         # Otherwise, if there's an exit code, or errmsg doesn't look like
         # successful header, then call it a generic SCMError.
         #
