diff --git a/product/ERP5/Document/SolverDecision.py b/product/ERP5/Document/SolverDecision.py
index 88a22e13d9f086747be7425baaa57a421d60cdc4..fb39fa954aa7d9002eb301de3f7c4a7906c018ab 100644
--- a/product/ERP5/Document/SolverDecision.py
+++ b/product/ERP5/Document/SolverDecision.py
@@ -32,8 +32,9 @@ from AccessControl import ClassSecurityInfo
 from Products.CMFCore.utils import getToolByName
 from Products.ERP5Type import Permissions, PropertySheet, interfaces
 from Products.ERP5Type.XMLObject import XMLObject
+from Products.ERP5.mixin.configurable import ConfigurableMixin
 
-class SolverDecision(XMLObject):
+class SolverDecision(ConfigurableMixin, XMLObject):
   """
     The goal of Solver Decision is to record the fact that
     "the user decided to solve a list of divergent delivery lines
@@ -76,6 +77,7 @@ class SolverDecision(XMLObject):
                     , PropertySheet.CategoryCore
                     , PropertySheet.DublinCore
                     , PropertySheet.SolverSelection
+                    , PropertySheet.Configurable
                     )
   # XXX-JPS missing property sheet or categories to specify 
   #   (default)delivery or solver_application or order -> the object of application of resolution
diff --git a/product/ERP5/mixin/configurable.py b/product/ERP5/mixin/configurable.py
new file mode 100644
index 0000000000000000000000000000000000000000..d5f8b3d157f5585174d6089bc0cc10655cb715f5
--- /dev/null
+++ b/product/ERP5/mixin/configurable.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+##############################################################################
+
+import zope.interface
+from AccessControl import ClassSecurityInfo
+from Acquisition import aq_base
+from Products.ERP5Type import Permissions, interfaces
+from Products.ERP5Type.Globals import PersistentMapping
+
+class ConfigurableMixin:
+  """
+  This class provides a generic implementation of IConfigurable.
+
+  Iconfigurable provides methods to record configuration properties.
+  It is used by solver decisions and solvers, but could be used for
+  other purpose.
+  """
+
+  # Declarative security
+  security = ClassSecurityInfo()
+  security.declareObjectProtected(Permissions.AccessContentsInformation)
+
+  # Declarative interfaces
+  zope.interface.implements(interfaces.IConfigurable,)
+
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getConfigurationPropertyIdList')
+  def getConfigurationPropertyIdList(self):
+    """
+    """
+    return self.getConfigurationPropertyDict().keys()
+
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getConfigurationPropertyDict')
+  def getConfigurationPropertyDict(self):
+    """
+    """
+    if getattr(aq_base(self), '_configuration_property_dict', None) is None:
+      self._configuration_property_dict = PersistentMapping()
+    return self._configuration_property_dict
+
+  security.declareProtected(Permissions.ModifyPortalContent,
+                            'updateConfiguration')
+  def updateConfiguration(self, **kw):
+    """
+    """
+    self.getConfigurationPropertyDict().update(kw)