Index: vcpx/tests/fixed_bugs.py
===================================================================
--- vcpx/tests/fixed_bugs.py	(revision 1230)
+++ vcpx/tests/fixed_bugs.py	(revision 1263)
@@ -58,5 +58,5 @@
         self.SHARED_BASEDIRS = False
 
-    def run_tailor(self):
+    def run_tailor(self, assert_function=None):
         test_name = self.test_name
 
@@ -68,4 +68,7 @@
             project.workingDir().source.changesets = self.CHANGESETS
             project()
+
+            if assert_function is not None:
+                assert_function(project, vcs)
 
     def testTicket64(self):
@@ -97,2 +100,29 @@
         ]
         self.run_tailor()
+
+    def testTicket74(self):
+        """Files must be physically removed on dir removal, so they don't get readded"""
+        self.TARGET_VCS = [ 'svn' ] # FAIL: bzr for sure, probably others
+        self.CHANGESETS = [
+            Changeset("Add dir/a{1,2,3}",
+                [ Entry(Entry.ADDED, 'dir/'),
+                  Entry(Entry.ADDED, 'dir/a1'),
+                  Entry(Entry.ADDED, 'dir/a2'),
+                  Entry(Entry.ADDED, 'dir/a3'),
+                ]),
+            Changeset("rm dir",
+                [ Entry(Entry.DELETED, 'dir/'), ]),
+            Changeset("Add dir/z{1,2,3}",
+                [ Entry(Entry.ADDED, 'dir/'),
+                  Entry(Entry.ADDED, 'dir/z1'),
+                  Entry(Entry.ADDED, 'dir/z2'),
+                  Entry(Entry.ADDED, 'dir/z3'),
+                ]),
+        ]
+        def assert_function(project, vcs):
+            repository = project.workingDir().target.repository
+            tree = join(repository.rootdir, repository.subdir)
+            for file in ('a1', 'a2', 'a3'):
+                self.failIf(exists(join(tree, 'dir', file)))
+
+        self.run_tailor(assert_function)
