diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 4fd10c78b904efc344ca86036d8e68038d9aeda2..9e5cefbe68805dbf7579e25077977569093eb6ef 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -8,6 +8,10 @@
 Bugs fixed
 ----------
 
+- Changes in way that garage collection treats dictionaries in Python
+  2.7 broke the object/connection cache implementation.
+  (https://bugs.launchpad.net/zodb/+bug/641481)
+
 - Updated the 'repozo --kill-old-on-full' option to remove any '.index'
   files corresponding to backups being removed.
 
diff --git a/src/persistent/cPickleCache.c b/src/persistent/cPickleCache.c
index d0dfe9b9b5c331160b13c7ff705dfe58748bb932..8099716f0e2d9cccd6c487848a5da6d5c7dee377 100644
--- a/src/persistent/cPickleCache.c
+++ b/src/persistent/cPickleCache.c
@@ -767,6 +767,7 @@ cc_new_ghost(ccobject *self, PyObject *args)
         return NULL;
       if (PyDict_SetItem(self->data, key, v) < 0)
         return NULL;
+      PyObject_GC_UnTrack((void *)self->data);
       self->klass_count++;
     }
   else
@@ -782,6 +783,7 @@ cc_new_ghost(ccobject *self, PyObject *args)
       if (PyDict_SetItem(self->data, key, v) < 0)
         return NULL;
       /* the dict should have a borrowed reference */
+      PyObject_GC_UnTrack((void *)self->data);
       Py_DECREF(v);
 
       Py_INCREF(self);
@@ -1098,6 +1100,7 @@ cc_add_item(ccobject *self, PyObject *key, PyObject *v)
     {
       if (PyDict_SetItem(self->data, key, v) < 0)
         return -1;
+      PyObject_GC_UnTrack((void *)self->data);
       self->klass_count++;
       return 0;
     }
@@ -1123,6 +1126,7 @@ cc_add_item(ccobject *self, PyObject *key, PyObject *v)
   if (PyDict_SetItem(self->data, key, v) < 0)
     return -1;
   /* the dict should have a borrowed reference */
+  PyObject_GC_UnTrack((void *)self->data);
   Py_DECREF(v);
 
   p = (cPersistentObject *)v;