diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
index acfca07a8f26e88e5373c5926b4c4263d5308400_bWVyY3VyaWFsL3NjbXV0aWwucHk=..236bb604dc39438327db8551ced7ad7b9c37e487_bWVyY3VyaWFsL3NjbXV0aWwucHk= 100644
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -803,6 +803,10 @@
         return self
 
     def __get__(self, obj, type=None):
+        # do we need to check if the file changed?
+        if self.name in obj.__dict__:
+            return obj.__dict__[self.name]
+
         entry = obj._filecache.get(self.name)
 
         if entry:
@@ -818,5 +822,5 @@
 
             obj._filecache[self.name] = entry
 
-        setattr(obj, self.name, entry.obj)
+        obj.__dict__[self.name] = entry.obj
         return entry.obj
@@ -822,1 +826,12 @@
         return entry.obj
+
+    def __set__(self, obj, value):
+        if self.name in obj._filecache:
+            obj._filecache[self.name].obj = value # update cached copy
+        obj.__dict__[self.name] = value # update copy returned by obj.x
+
+    def __delete__(self, obj):
+        try:
+            del obj.__dict__[self.name]
+        except KeyError:
+            raise AttributeError, self.name
diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py
index acfca07a8f26e88e5373c5926b4c4263d5308400_bWVyY3VyaWFsL3N0YXRpY2h0dHByZXBvLnB5..236bb604dc39438327db8551ced7ad7b9c37e487_bWVyY3VyaWFsL3N0YXRpY2h0dHByZXBvLnB5 100644
--- a/mercurial/statichttprepo.py
+++ b/mercurial/statichttprepo.py
@@ -112,6 +112,7 @@
         self.spath = self.store.path
         self.sopener = self.store.opener
         self.sjoin = self.store.join
+        self._filecache = {}
 
         self.manifest = manifest.manifest(self.sopener)
         self.changelog = changelog.changelog(self.sopener)
@@ -122,7 +123,6 @@
         self.encodepats = None
         self.decodepats = None
         self.capabilities.difference_update(["pushkey"])
-        self._filecache = {}
 
     def url(self):
         return self._url
diff --git a/tests/test-commandserver.py b/tests/test-commandserver.py
index acfca07a8f26e88e5373c5926b4c4263d5308400_dGVzdHMvdGVzdC1jb21tYW5kc2VydmVyLnB5..236bb604dc39438327db8551ced7ad7b9c37e487_dGVzdHMvdGVzdC1jb21tYW5kc2VydmVyLnB5 100644
--- a/tests/test-commandserver.py
+++ b/tests/test-commandserver.py
@@ -181,6 +181,13 @@
     os.system('hg upd bm1 -q')
     runcommand(server, ['bookmarks'])
 
+    runcommand(server, ['bookmarks', 'bm3'])
+    f = open('a', 'ab')
+    f.write('a\n')
+    f.close()
+    runcommand(server, ['commit', '-Amm'])
+    runcommand(server, ['bookmarks'])
+
 def tagscache(server):
     readchannel(server)
     runcommand(server, ['id', '-t', '-r', '0'])
diff --git a/tests/test-commandserver.py.out b/tests/test-commandserver.py.out
index acfca07a8f26e88e5373c5926b4c4263d5308400_dGVzdHMvdGVzdC1jb21tYW5kc2VydmVyLnB5Lm91dA==..236bb604dc39438327db8551ced7ad7b9c37e487_dGVzdHMvdGVzdC1jb21tYW5kc2VydmVyLnB5Lm91dA== 100644
--- a/tests/test-commandserver.py.out
+++ b/tests/test-commandserver.py.out
@@ -114,6 +114,12 @@
  runcommand bookmarks
  * bm1                       1:d3a0a68be6de
    bm2                       1:d3a0a68be6de
+ runcommand bookmarks bm3
+ runcommand commit -Amm
+ runcommand bookmarks
+   bm1                       1:d3a0a68be6de
+   bm2                       1:d3a0a68be6de
+ * bm3                       2:aef17e88f5f0
 
 testing tagscache:
 
@@ -125,5 +131,5 @@
 testing setphase:
 
  runcommand phase -r .
-2: draft
+3: draft
  runcommand phase -r .
@@ -129,2 +135,2 @@
  runcommand phase -r .
-2: public
+3: public