diff --git a/test.py b/test.py
index 5c2968d2d92dd7230643c5340cee836957f00e83..b0a0e9fa261dcedf8d061b591aa675d467abe090 100644
--- a/test.py
+++ b/test.py
@@ -261,13 +261,8 @@ class AgkyraTest(unittest.TestCase):
         inner_fil = "f005/in005"
         inner_fil_content = "ff1 in dir "
         r1 = self.pithos.upload_from_string(inner_fil, inner_fil_content)
-        inner_fil2 = "f005/in2005"
-        inner_fil2_content = "inner2 in dir "
-        r1 = self.pithos.upload_from_string(inner_fil2, inner_fil2_content)
         self.s.probe_file(self.s.MASTER, fil)
         self.s.probe_file(self.s.MASTER, inner_fil)
-        self.s.probe_file(self.s.MASTER, inner_fil2)
-        self.assert_message(messaging.UpdateMessage)
         self.assert_message(messaging.UpdateMessage)
         self.assert_message(messaging.UpdateMessage)
 
@@ -290,6 +285,7 @@ class AgkyraTest(unittest.TestCase):
         self.s.decide_file_sync(fil)
         self.assert_message(messaging.SyncMessage)
         self.assert_message(messaging.AckSyncMessage)
+        self.assertTrue(os.path.isdir(f_path))
         self.s.decide_file_sync(inner_fil)
         self.assert_message(messaging.SyncMessage)
         self.assert_message(messaging.AckSyncMessage)
@@ -342,6 +338,7 @@ class AgkyraTest(unittest.TestCase):
         self.assert_message(messaging.SyncMessage)
         self.assert_message(messaging.AckSyncMessage)
         self.assertTrue(os.path.isdir(d_path))
+        # sync the dir too
         self.s.probe_file(self.s.SLAVE, d)
         m = self.assert_message(messaging.UpdateMessage)
         slave_serial = m.serial
@@ -352,149 +349,142 @@ class AgkyraTest(unittest.TestCase):
         state = self.db.get_state(self.s.SLAVE, d)
         self.assertEqual(state.serial, master_serial)
 
+        # locally remove the dir and sync
+        shutil.rmtree(d_path)
+        self.s.probe_file(self.s.SLAVE, d)
+        self.s.probe_file(self.s.SLAVE, inner_fil)
+        self.assert_message(messaging.UpdateMessage)
+        self.assert_message(messaging.UpdateMessage)
+        self.s.decide_file_sync(d)
+        self.s.decide_file_sync(inner_fil)
+        self.assert_message(messaging.SyncMessage)
+        self.assert_message(messaging.SyncMessage)
+        self.assert_message(messaging.AckSyncMessage)
+        self.assert_message(messaging.AckSyncMessage)
+        with self.assertRaises(ClientError) as cm:
+            self.pithos.get_object_info(d)
+        self.assertEqual(cm.exception.status, 404)
+
+    def test_009_dir_delete_upstream(self):
+        d = "d009"
+        d_path = self.get_path(d)
+        r = self.pithos.object_put(
+            d, content_type='application/directory', content_length=0)
+        innerd = "d009/innerd009"
+        r = self.pithos.object_put(
+            innerd, content_type='application/directory', content_length=0)
+        self.s.probe_file(self.s.MASTER, d)
+        self.s.probe_file(self.s.MASTER, innerd)
+        self.assert_message(messaging.UpdateMessage)
+        self.assert_message(messaging.UpdateMessage)
+        self.s.decide_file_sync(d)
+        self.assert_message(messaging.SyncMessage)
+        self.assert_message(messaging.AckSyncMessage)
+        self.s.decide_file_sync(innerd)
+        self.assert_message(messaging.SyncMessage)
+        self.assert_message(messaging.AckSyncMessage)
+        self.assertTrue(os.path.isdir(d_path))
+
+        # delete upstream
+        self.pithos.del_object(d)
+        self.pithos.del_object(innerd)
+        self.s.probe_file(self.s.MASTER, d)
+        self.s.probe_file(self.s.MASTER, innerd)
+        self.assert_message(messaging.UpdateMessage)
+        self.assert_message(messaging.UpdateMessage)
+
+        # will fail because local dir is non-empty
+        self.s.decide_file_sync(d)
+        self.assert_message(messaging.SyncMessage)
+        self.assert_message(messaging.SyncErrorMessage)
+
+        # but this is ok
+        self.s.decide_file_sync(innerd)
+        self.assert_message(messaging.SyncMessage)
+        self.assert_message(messaging.AckSyncMessage)
+        self.s.decide_file_sync(d)
+        self.assert_message(messaging.SyncMessage)
+        self.assert_message(messaging.AckSyncMessage)
+
+    def test_010_live_update_local(self):
+        fil = "f010"
+        f_path = self.get_path(fil)
+        with open(f_path, "w") as f:
+            f.write("f to be changed")
+
+        self.s.probe_file(self.s.SLAVE, fil)
+        self.assert_message(messaging.UpdateMessage)
+        state = self.db.get_state(self.s.SLAVE, fil)
+        f_info = state.info
+
+        f_content = "changed"
+        with open(f_path, "w") as f:
+            f.write(f_content)
+
+        self.s.decide_file_sync(fil)
+        self.assert_message(messaging.SyncMessage)
+        self.assert_message(messaging.LiveInfoUpdateMessage)
+        self.assert_message(messaging.AckSyncMessage)
+
+        state = self.db.get_state(self.s.SLAVE, fil)
+        new_info = state.info
+        self.assertNotEqual(f_info, new_info)
+        self.assertEqual(new_info["localfs_size"], len(f_content))
+
+    def test_011_live_update_upstream(self):
+        fil = "f011"
+        f_path = self.get_path(fil)
+        r = self.pithos.upload_from_string(fil, "f upstream")
+        etag = r['etag']
+
+        self.s.probe_file(self.s.MASTER, fil)
+        self.assert_message(messaging.UpdateMessage)
+        state = self.db.get_state(self.s.MASTER, fil)
+        f_info = state.info
+        self.assertEqual(f_info["pithos_etag"], etag)
+
+        r1 = self.pithos.upload_from_string(fil, "new")
+        new_etag = r1['etag']
+
+        self.s.decide_file_sync(fil)
+        self.assert_message(messaging.SyncMessage)
+        self.assert_message(messaging.LiveInfoUpdateMessage)
+        self.assert_message(messaging.AckSyncMessage)
+        state = self.db.get_state(self.s.MASTER, fil)
+        new_info = state.info
+        self.assertEqual(new_info["pithos_etag"], new_etag)
+
+    def test_012_cachename(self):
+        fil = "f012"
+        f_path = self.get_path(fil)
+        with open(f_path, "w") as f:
+            f.write("content")
+
+        state = self.db.get_state(self.s.SLAVE, fil)
+        handle = LocalfsTargetHandle(self.s.settings, state)
+        hidden_filename = utils.join_path(
+            handle.cache_hide_name, utils.hash_string(handle.objname))
+        hidden_path = handle.get_path_in_cache(hidden_filename)
+        self.assertFalse(os.path.isfile(hidden_path))
+
+        self.assertIsNone(self.db.get_cachename(hidden_filename))
+        handle.move_file()
+
+        self.assertTrue(os.path.isfile(hidden_path))
+        self.assertIsNotNone(self.db.get_cachename(hidden_filename))
+        handle.move_file()
+        self.assertTrue(os.path.isfile(hidden_path))
+
+        shutil.move(hidden_path, f_path)
+        self.assertIsNotNone(self.db.get_cachename(hidden_filename))
+        handle.move_file()
+        self.assertTrue(os.path.isfile(hidden_path))
+
+        # open file to cause busy error
+        f = open(hidden_path, "r")
+        with self.assertRaises(common.BusyError):
+            handle.hide_file()
+
+
 if __name__ == '__main__':
     unittest.main()
-
-# ln1 is a file; let a dir be upstream
-r = pithos.object_put(
-    ln1, content_type='application/directory',
-    content_length=0)
-
-s.probe_file(s.MASTER, ln1)
-s.decide_file_sync(ln1)
-
-assert_message(messaging.UpdateMessage)
-assert_message(messaging.SyncMessage)
-assert_message(messaging.AckSyncMessage)
-assert os.path.isdir(ln1_path)
-
-# locally remove dir and file
-shutil.rmtree(d1_path)
-s.probe_file(s.SLAVE, d1)
-s.probe_file(s.SLAVE, f2)
-
-assert_message(messaging.UpdateMessage)
-assert_message(messaging.UpdateMessage)
-
-s.decide_file_sync(d1)
-s.decide_file_sync(f2)
-
-assert_message(messaging.SyncMessage)
-assert_message(messaging.SyncMessage)
-assert_message(messaging.AckSyncMessage)
-assert_message(messaging.AckSyncMessage)
-
-try:
-    pithos.get_object_info(d1)
-    assert False
-except Exception as e:
-    assert isinstance(e, ClientError) and e.status == 404
-
-# delete upstream
-pithos.del_object(f1)
-pithos.del_object(ff1)
-s.probe_file(s.MASTER, f1)
-s.probe_file(s.MASTER, ff1)
-assert_message(messaging.UpdateMessage)
-assert_message(messaging.UpdateMessage)
-
-# will fail because local dir is non-empty
-s.decide_file_sync(f1)
-
-assert_message(messaging.SyncMessage)
-assert_message(messaging.SyncErrorMessage)
-
-# but this is ok
-s.decide_file_sync(ff1)
-
-assert_message(messaging.SyncMessage)
-assert_message(messaging.AckSyncMessage)
-
-print "SLEEPING 11"
-time.sleep(11)
-s.decide_file_sync(f1)
-
-assert_message(messaging.SyncMessage)
-assert_message(messaging.AckSyncMessage)
-
-# this will be changed after probe
-fchanged = "fchanged"
-fchanged_path = os.path.join(LOCAL_ROOT_PATH, fchanged)
-with open(fchanged_path, "w") as f:
-    f.write("fchanged orig")
-
-s.probe_file(s.SLAVE, fchanged)
-assert_message(messaging.UpdateMessage)
-
-state = db.get_state(s.SLAVE, fchanged)
-fchanged_info = state.info
-
-fchanged_new = "new content changed"
-with open(fchanged_path, "w") as f:
-    f.write(fchanged_new)
-
-s.decide_file_sync(fchanged)
-assert_message(messaging.SyncMessage)
-assert_message(messaging.LiveInfoUpdateMessage)
-assert_message(messaging.AckSyncMessage)
-
-state = db.get_state(s.SLAVE, fchanged)
-new_fchanged_info = state.info
-assert fchanged_info != new_fchanged_info
-print new_fchanged_info
-assert new_fchanged_info["localfs_size"] == len(fchanged_new)
-
-fupch = "fupch"
-r1 = pithos.upload_from_string(
-    fupch, "fupch")
-fupch_etag = r1['etag']
-
-s.probe_file(s.MASTER, fupch)
-assert_message(messaging.UpdateMessage)
-state = db.get_state(s.MASTER, fupch)
-fupch_info = state.info
-assert fupch_info["pithos_etag"] == fupch_etag
-
-r1 = pithos.upload_from_string(
-    fupch, "fupch new")
-new_fupch_etag = r1['etag']
-
-s.decide_file_sync(fupch)
-assert_message(messaging.SyncMessage)
-assert_message(messaging.LiveInfoUpdateMessage)
-assert_message(messaging.AckSyncMessage)
-state = db.get_state(s.MASTER, fupch)
-new_fupch_info = state.info
-assert new_fupch_info["pithos_etag"] == new_fupch_etag
-
-#############################################################
-### INTERNALS
-
-fupch_path = os.path.join(LOCAL_ROOT_PATH, fupch)
-assert os.path.isfile(fupch_path)
-state = db.get_state(s.SLAVE, fupch)
-handle = LocalfsTargetHandle(s.settings, state)
-hidden_filename = utils.join_path(handle.cache_hide_name,
-                                  utils.hash_string(handle.objname))
-hidden_path = handle.get_path_in_cache(hidden_filename)
-assert not os.path.isfile(hidden_path)
-
-assert db.get_cachename(hidden_filename) is None
-handle.move_file()
-assert os.path.isfile(hidden_path)
-assert db.get_cachename(hidden_filename) is not None
-handle.move_file()
-assert os.path.isfile(hidden_path)
-
-shutil.move(hidden_path, fupch_path)
-assert db.get_cachename(hidden_filename) is not None
-handle.move_file()
-assert os.path.isfile(hidden_path)
-
-# open file to cause busy error
-f = open(hidden_path, "r")
-try:
-    handle.hide_file()
-    assert False
-except Exception as e:
-    assert isinstance(e, common.BusyError)