diff --git a/product/ERP5/Document/MappedProperty.py b/product/ERP5/Document/MappedProperty.py
index 52376fabde531609529b182458630fd8fbce9a0b..32a5ecec85286feae42b516470ce7ef28d81f097 100644
--- a/product/ERP5/Document/MappedProperty.py
+++ b/product/ERP5/Document/MappedProperty.py
@@ -49,6 +49,36 @@ class MappedProperty(XMLObject):
                      PropertySheet.CategoryCore,
                      PropertySheet.MappedProperty)
 
+  # XXX do we need to protect this method?
+  def getMappingDict(self, reverse=False):
+    # Use volatile attributes for caching.
+    try:
+      if reverse:
+        return self._v_reverse_mapping_dict
+      else:
+        return self._v_mapping_dict
+    except AttributeError:
+      mapping_dict = {}
+      for line in self.getMappingPropertyList():
+        f, t = [x.strip() for x in line.split('|', 1)]
+        if reverse:
+          if t[:1] == '-':
+            f, t = t[1:], '-' + f
+          else:
+            f, t = t, f
+          mapping_dict[f] = t
+        else:
+          mapping_dict[f] = t
+      if reverse:
+        self._v_reverse_mapping_dict = mapping_dict
+      else:
+        self._v_mapping_dict = mapping_dict
+      return mapping_dict
+
+  # XXX do we need to protect this method?
+  def getMappedPropertyId(self, property, reverse=False):
+    return self.getMappingDict(reverse=reverse).get(property, property)
+
   # Security should be handled by the target document not by the mapped
   # property document.
   security.declarePublic('getMappedProperty')
@@ -58,8 +88,7 @@ class MappedProperty(XMLObject):
       getProperty = document.getPropertyList
     else:
       getProperty = document.getProperty
-    mapping_dict = dict([[x.strip() for x in x.split('|')] \
-                         for x in self.getMappingPropertyList()])
+    mapping_dict = self.getMappingDict()
     mapped_property = mapping_dict.get(property, property)
     if mapped_property.startswith('-'):
       return -1 * getProperty(mapped_property[1:])
@@ -75,15 +104,9 @@ class MappedProperty(XMLObject):
       setProperty = document.setPropertyList
     else:
       setProperty = document.setProperty
-    mapping_dict = {}
-    for x in self.getMappingPropertyList():
-      from_property, to_property = [x.strip() for x in x.split('|')]
-      if to_property.startswith('-'):
-        mapping_dict[to_property[1:]] = '-%s' % from_property
-      else:
-        mapping_dict[to_property] = from_property
+    mapping_dict = self.getMappingDict(reverse=True)
     mapped_property = mapping_dict.get(property, property)
     if mapped_property.startswith('-'):
-      return setProperty(-1 * value)
+      return setProperty(mapped_property, -1 * value)
     else:
-      return setProperty(value)
+      return setProperty(mapped_property, value)