Index: pyatspi/accessible.py
===================================================================
--- pyatspi/accessible.py	(revision 942)
+++ pyatspi/accessible.py	(working copy)
@@ -49,6 +49,8 @@
 _ACCESSIBLE_CACHE = {}
 _CACHE_LEVEL = None
 
+_USER_DATA = {}
+
 class _PropertyCache(object):
   '''Fixed-size bag class for holding cached values.'''
   __slots__ = ('name', 'description', 'rolename')
@@ -324,7 +326,7 @@
   @type SLOTS: tuple
   '''
   SLOTTED_CLASSES = {}
-  SLOTS = ('_icache', 'user_data')
+  SLOTS = ('_icache',)
   
   def __new__(cls):
     '''
@@ -365,8 +367,14 @@
     counting for AT-SPI objects. Also removes this object from the cache if
     we're caching properties. 
     '''
+    h = hash(self)
+    if self._get_orbit_object_refcount() <= 1:
+      try:
+        del _USER_DATA[h]
+      except KeyError:
+        pass
     try:
-      del _ACCESSIBLE_CACHE[hash(self)]
+      del _ACCESSIBLE_CACHE[h]
     except KeyError:
       pass
     try:
@@ -434,6 +442,25 @@
     '''
     return self.childCount
   
+  def _get_user_data(self):
+    '''
+    Gets the user_data from global dict if available.
+    '''
+    h = hash(self)
+    try:
+      return _USER_DATA[h]
+    except KeyError:
+      return None
+
+  def _set_user_data(self, value):
+    '''
+    Sets user data to global dict.
+    '''
+    h = hash(self)
+    _USER_DATA[h] = value
+    
+  user_data = property(_get_user_data, _set_user_data)
+
   def _get_name(self):
     '''
     Gets the name of the accessible from the cache if it is available, 
