diff --git a/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Rule_view.xml b/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Rule_view.xml
index 28a36a61965772be4ef48ca3946aa491bd43a249..3d0f69e90a7d42f26d06b04aca627532a1680399 100644
--- a/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Rule_view.xml
+++ b/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Rule_view.xml
@@ -102,6 +102,7 @@
                         <string>my_reference</string>
                         <string>my_version</string>
                         <string>my_trade_phase_list</string>
+                        <string>my_same_total_quantity</string>
                       </list>
                     </value>
                 </item>
diff --git a/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Rule_view/my_same_total_quantity.xml b/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Rule_view/my_same_total_quantity.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6e10b01213f9af9ff59807f54980c4789c404311
--- /dev/null
+++ b/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Rule_view/my_same_total_quantity.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>my_same_total_quantity</string> </value>
+        </item>
+        <item>
+            <key> <string>message_values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>external_validator_failed</string> </key>
+                    <value> <string>The input failed the external validator.</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>overrides</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>tales</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string>my_checkbox</string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string>Base_viewFieldLibrary</string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string>Click to edit the target</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/Solver_viewConfiguration.xml b/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Solver_viewConfiguration.xml
similarity index 100%
rename from bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/Solver_viewConfiguration.xml
rename to bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Solver_viewConfiguration.xml
diff --git a/bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/Solver_viewConfiguration/my_configuration.xml b/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Solver_viewConfiguration/my_configuration.xml
similarity index 100%
rename from bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/Solver_viewConfiguration/my_configuration.xml
rename to bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Solver_viewConfiguration/my_configuration.xml
diff --git a/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Solver_viewConfigurationFormBox.xml b/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Solver_viewConfigurationFormBox.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c379c57856a8e1813d7fd44144e50043cfb70400
--- /dev/null
+++ b/bt5/erp5_simulation/SkinTemplateItem/portal_skins/erp5_simulation/Solver_viewConfigurationFormBox.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="ERP5Form" module="Products.ERP5Form.Form"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_bind_names</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>_asgns</string> </key>
+                        <value>
+                          <dictionary/>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>_objects</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>action</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>edit_order</string> </key>
+            <value>
+              <list/>
+            </value>
+        </item>
+        <item>
+            <key> <string>encoding</string> </key>
+            <value> <string>UTF-8</string> </value>
+        </item>
+        <item>
+            <key> <string>enctype</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>group_list</string> </key>
+            <value>
+              <list>
+                <string>left</string>
+              </list>
+            </value>
+        </item>
+        <item>
+            <key> <string>groups</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>left</string> </key>
+                    <value>
+                      <list/>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>Solver_viewConfigurationFormBox</string> </value>
+        </item>
+        <item>
+            <key> <string>method</string> </key>
+            <value> <string>POST</string> </value>
+        </item>
+        <item>
+            <key> <string>name</string> </key>
+            <value> <string>Solver_viewConfiguration</string> </value>
+        </item>
+        <item>
+            <key> <string>pt</string> </key>
+            <value> <string>embedded_form_render</string> </value>
+        </item>
+        <item>
+            <key> <string>row_length</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>stored_encoding</string> </key>
+            <value> <string>UTF-8</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Configuration</string> </value>
+        </item>
+        <item>
+            <key> <string>unicode_mode</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>update_action</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>update_action_title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_simulation/bt/revision b/bt5/erp5_simulation/bt/revision
index 2efea5198bec85fb12bc22ec549bd4db99be6de5..a3090d211bbafbc4b28678d4a9207c284ae447d9 100644
--- a/bt5/erp5_simulation/bt/revision
+++ b/bt5/erp5_simulation/bt/revision
@@ -1 +1 @@
-167
\ No newline at end of file
+168
\ No newline at end of file
diff --git a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Accept%20Solver.xml b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Accept%20Solver.xml
index 04c0b83d7061de82e69b3d6b16bb558d18492110..7adf0de5341f55da05c1be636e420758af72bf0c 100644
--- a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Accept%20Solver.xml
+++ b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Accept%20Solver.xml
@@ -90,7 +90,7 @@
         </item>
         <item>
             <key> <string>configuration_form_id</string> </key>
-            <value> <string>Solver_viewConfigurationFormBox</string> </value>
+            <value> <string>GenericSolver_viewConfigurationFormBox</string> </value>
         </item>
         <item>
             <key> <string>configuration_property_list</string> </key>
diff --git a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Adopt%20Solver.xml b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Adopt%20Solver.xml
index fe8b9e4722b0d5e761c0c00894ed82ecbbc344b3..a69770aab37b61def7af264cc1a93fd495900f83 100644
--- a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Adopt%20Solver.xml
+++ b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Adopt%20Solver.xml
@@ -109,7 +109,7 @@
         </item>
         <item>
             <key> <string>configuration_form_id</string> </key>
-            <value> <string>Solver_viewConfigurationFormBox</string> </value>
+            <value> <string>GenericSolver_viewConfigurationFormBox</string> </value>
         </item>
         <item>
             <key> <string>description</string> </key>
diff --git a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Quantity%20Cancel%20Solver.xml b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Quantity%20Cancel%20Solver.xml
index 5152ed72743015a3a844301e5d38c4e15ded7ef6..eab836ecd9248e4f39e5b8e2329ea465a8c91963 100644
--- a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Quantity%20Cancel%20Solver.xml
+++ b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Quantity%20Cancel%20Solver.xml
@@ -90,7 +90,7 @@
         </item>
         <item>
             <key> <string>configuration_form_id</string> </key>
-            <value> <string>Solver_viewConfigurationFormBox</string> </value>
+            <value> <string>GenericSolver_viewConfigurationFormBox</string> </value>
         </item>
         <item>
             <key> <string>configuration_property_list</string> </key>
diff --git a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Trade%20Model%20Solver.xml b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Trade%20Model%20Solver.xml
index 1d50a9912ee84530a8c31abf3c05947e63d1eec3..c9ad896087a6b4152d095c4768fa7c96b983291f 100644
--- a/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Trade%20Model%20Solver.xml
+++ b/bt5/erp5_simulation_test/PathTemplateItem/portal_solvers/Trade%20Model%20Solver.xml
@@ -111,7 +111,7 @@
         </item>
         <item>
             <key> <string>configuration_form_id</string> </key>
-            <value> <string>Solver_viewConfigurationFormBox</string> </value>
+            <value> <string>GenericSolver_viewConfigurationFormBox</string> </value>
         </item>
         <item>
             <key> <string>configuration_groupable</string> </key>
diff --git a/bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/Solver_viewConfigurationFormBox.xml b/bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/GenericSolver_viewConfigurationFormBox.xml
similarity index 97%
rename from bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/Solver_viewConfigurationFormBox.xml
rename to bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/GenericSolver_viewConfigurationFormBox.xml
index 38de8300d73cf553fea0dc0d348ba4fb3e260ecd..0f8cc5fc29c711e29c381e48746f3e391a0bb0a1 100644
--- a/bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/Solver_viewConfigurationFormBox.xml
+++ b/bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/GenericSolver_viewConfigurationFormBox.xml
@@ -80,7 +80,7 @@
         </item>
         <item>
             <key> <string>id</string> </key>
-            <value> <string>Solver_viewConfigurationFormBox</string> </value>
+            <value> <string>GenericSolver_viewConfigurationFormBox</string> </value>
         </item>
         <item>
             <key> <string>method</string> </key>
diff --git a/bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/Solver_viewConfigurationFormBox/my_tested_property_list.xml b/bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/GenericSolver_viewConfigurationFormBox/my_tested_property_list.xml
similarity index 100%
rename from bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/Solver_viewConfigurationFormBox/my_tested_property_list.xml
rename to bt5/erp5_simulation_test/SkinTemplateItem/portal_skins/erp5_simulation_test/GenericSolver_viewConfigurationFormBox/my_tested_property_list.xml
diff --git a/product/ERP5Type/dynamic/lazy_class.py b/product/ERP5Type/dynamic/lazy_class.py
index 23102af65bcf97fae0b82aba96099ac4907b8d12..78d8aa81984cf6099bdbdeabaf0ddaebc825a9c5 100644
--- a/product/ERP5Type/dynamic/lazy_class.py
+++ b/product/ERP5Type/dynamic/lazy_class.py
@@ -231,7 +231,7 @@ class PortalTypeMetaClass(GhostBaseMetaClass, PropertyHolder):
       cls.loadClass()
       return getattr(cls, name)
 
-    raise AttributeError
+    raise AttributeError("'%r' has no attribute '%s'" % (cls, name))
 
   def generatePortalTypeAccessors(cls, site, portal_type_category_list):
     category_tool = getattr(site, 'portal_categories', None)
diff --git a/product/ERP5Type/tests/ERP5TypeTestCase.py b/product/ERP5Type/tests/ERP5TypeTestCase.py
index 4a39cea146fa51d4a39abd753d6e69a7a6bc4ada..483916d4e1a39245bf19eaa7821b5668f255f27b 100644
--- a/product/ERP5Type/tests/ERP5TypeTestCase.py
+++ b/product/ERP5Type/tests/ERP5TypeTestCase.py
@@ -522,6 +522,16 @@ class ERP5TypeTestCaseMixin(ProcessingNodeTestCase, PortalTestCase):
       self.assertEquals(set(a), set(b), msg)
     assertSameSet = failIfDifferentSet
 
+    def assertHasAttribute(self, obj, attribute, msg=None):
+      self.failIfEqual(None, getattr(obj, attribute, None),
+                       msg or "'%r': no attribute '%s'" % (obj,
+                                                           attribute))
+
+    def failIfHasAttribute(self, obj, attribute, msg=None):
+      self.assertEquals(None, getattr(obj, attribute, None),
+                        msg or "'%r': attribute '%s' present" % (obj,
+                                                                 attribute))
+
     def assertWorkflowTransitionFails(self, object, workflow_id, transition_id,
         error_message=None, state_variable='simulation_state'):
       """
diff --git a/product/ERP5Type/tests/testDynamicClassGeneration.py b/product/ERP5Type/tests/testDynamicClassGeneration.py
index 3340f17e9dd9a834338c2f0ab73fe4e2408ff3aa..f04946c1d9be387136a8502e5fc6604db04e2741 100644
--- a/product/ERP5Type/tests/testDynamicClassGeneration.py
+++ b/product/ERP5Type/tests/testDynamicClassGeneration.py
@@ -616,16 +616,6 @@ class TestZodbPropertySheet(ERP5TypeTestCase):
     transaction.commit()
     self.test_module.getId()
 
-  def assertHasAttribute(self, obj, attribute, msg=None):
-    self.failIfEqual(None, getattr(obj, attribute, None),
-                     msg or '%s: no attribute %s' % (obj.__name__,
-                                                     attribute))
-
-  def failIfHasAttribute(self, obj, attribute, msg=None):
-    self.assertEquals(None, getattr(obj, attribute, None),
-                      msg or '%s: attribute %s present' % (obj.__name__,
-                                                           attribute))
-
   def testAssignUnassignZodbPropertySheet(self):
     """
     From an existing portal type, assign ZODB Property Sheets and