diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/EntityPropertiesConverter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/EntityPropertiesConverter.java
index d71bd1e1850e76137f5231733de7f9499e4fb5fa..7d8e9567bd823b0142f790a8fb63eb98e547f544 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/EntityPropertiesConverter.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/EntityPropertiesConverter.java
@@ -597,6 +597,10 @@ public final class EntityPropertiesConverter implements IEntityPropertiesConvert
                                 .substring(BasicConstant.MANAGED_PROPERTY_JSON_PREFIX.length()),
                                 List.class);
                 ManagedProperty managedProperty = new ManagedProperty();
+                IPerson person = PersonTranslator.translateToIPerson(personPE);
+
+                List<Map<String, String>> bindingsList = new ArrayList<Map<String, String>>();
+
                 for (Object row : readValue)
                 {
                     if (row instanceof Map == false)
@@ -604,10 +608,10 @@ public final class EntityPropertiesConverter implements IEntityPropertiesConvert
                         continue;
                     }
 
-                    IPerson person = PersonTranslator.translateToIPerson(personPE);
-                    evaluator.updateFromBatchInput(managedProperty, person,
-                            (Map<String, String>) row);
+                    bindingsList.add((Map<String, String>) row);
                 }
+
+                evaluator.updateFromRegistrationForm(managedProperty, person, bindingsList);
                 return managedProperty.getValue();
             } catch (Exception ex)
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluator.java
index 8853ad218b1ef8b54c67d90cbca5279698cd5736..d34cbb4f4ae591c7d34b4e81484bc1e992bc2a26 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluator.java
@@ -100,6 +100,12 @@ public class ManagedPropertyEvaluator
      */
     private static final String UPDATE_FROM_BATCH_INPUT_FUNCTION = "updateFromBatchInput";
 
+    /**
+     * The name of the function that expects a list of maps of bindings.
+     */
+    private static final String UPDATE_FROM_REGISTRATION_FORM_FUNCTION =
+            "updateFromRegistrationForm";
+
     private static final String PROPERTY_VARIABLE_NAME = "property";
 
     private static final String PROPERTY_PE_VARIABLE_NAME = "propertyPE";
@@ -112,6 +118,8 @@ public class ManagedPropertyEvaluator
 
     private final boolean updateFromBatchFunctionDefined;
 
+    private final boolean updateFromRegistrationFormFunctionDefined;
+
     private final boolean showRawValueInForms;
 
     private List<IManagedInputWidgetDescription> inputWidgetDescriptions;
@@ -120,6 +128,8 @@ public class ManagedPropertyEvaluator
     {
         evaluator = new Evaluator("", ManagedPropertyFunctions.class, scriptExpression);
         updateFromBatchFunctionDefined = evaluator.hasFunction(UPDATE_FROM_BATCH_INPUT_FUNCTION);
+        updateFromRegistrationFormFunctionDefined =
+                evaluator.hasFunction(UPDATE_FROM_REGISTRATION_FORM_FUNCTION);
         boolean batchColumnNamesFunctionDefined =
                 evaluator.hasFunction(BATCH_COLUMN_NAMES_FUNCTION);
         boolean inputWidgetsFunctionDefined = evaluator.hasFunction(INPUT_WIDGETS_FUNCTION);
@@ -192,18 +202,23 @@ public class ManagedPropertyEvaluator
     private void checkCombinationsOfDefinedFunctions(boolean batchColumnNamesFunctionDefined,
             boolean inputWidgetsFunctionDefined)
     {
-        if ((batchColumnNamesFunctionDefined || inputWidgetsFunctionDefined)
-                && updateFromBatchFunctionDefined == false)
+        if (batchColumnNamesFunctionDefined && updateFromBatchFunctionDefined == false)
         {
             StringBuilder builder = new StringBuilder("Function ");
             builder.append(UPDATE_FROM_BATCH_INPUT_FUNCTION);
-            builder.append(" is not defined although function");
-            boolean both = batchColumnNamesFunctionDefined && inputWidgetsFunctionDefined;
-            builder.append(both ? "s " : " ");
-            builder.append(batchColumnNamesFunctionDefined ? BATCH_COLUMN_NAMES_FUNCTION : "");
-            builder.append(both ? " and " : "");
-            builder.append(inputWidgetsFunctionDefined ? INPUT_WIDGETS_FUNCTION : "");
-            builder.append(both ? " are defined." : " is defined.");
+            builder.append(" is not defined although function ");
+            builder.append(BATCH_COLUMN_NAMES_FUNCTION);
+            builder.append(" is defined.");
+            throw new EvaluatorException(builder.toString());
+        }
+
+        if (inputWidgetsFunctionDefined && updateFromRegistrationFormFunctionDefined == false)
+        {
+            StringBuilder builder = new StringBuilder("Function ");
+            builder.append(UPDATE_FROM_REGISTRATION_FORM_FUNCTION);
+            builder.append(" is not defined although function ");
+            builder.append(INPUT_WIDGETS_FUNCTION);
+            builder.append(" is defined.");
             throw new EvaluatorException(builder.toString());
         }
     }
@@ -296,4 +311,14 @@ public class ManagedPropertyEvaluator
         }
     }
 
+    public void updateFromRegistrationForm(IManagedProperty managedProperty, IPerson person,
+            List<Map<String, String>> bindings)
+    {
+        if (updateFromRegistrationFormFunctionDefined)
+        {
+            evaluator.set(PROPERTY_VARIABLE_NAME, managedProperty);
+            evaluator.set(PERSON_VARIABLE_NAME, person);
+            evaluator.evalFunction(UPDATE_FROM_REGISTRATION_FORM_FUNCTION, bindings);
+        }
+    }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/EntityPropertiesConverterTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/EntityPropertiesConverterTest.java
index 7ae610c722e79a05b53fd5565095c33b91f4e696..23acf350c492f07d1ca6c27ef27ba10ae63e516c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/EntityPropertiesConverterTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/EntityPropertiesConverterTest.java
@@ -223,8 +223,9 @@ public final class EntityPropertiesConverterTest extends AbstractBOTest
                     ScriptPE script = new ScriptPE();
                     script.setScriptType(ScriptType.MANAGED_PROPERTY);
                     script.setScript("def batchColumnNames():\n return ['A']\n"
-                            + "def updateFromBatchInput(bindings):\n"
-                            + " property.setValue('Hello ' + bindings.get('A'))");
+                            + "def updateFromBatchInput(bindings):\n None\n"
+                            + "def updateFromRegistrationForm(bindings):\n"
+                            + " property.setValue('Hello ' + bindings.get(0).get('A'))");
                     sampleTypePropertyTypePE.setScript(script);
 
                     final SampleTypePE sampleType2 = createSampleType(SAMPLE_TYPE2_CODE);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluatorTest.java
index 7ebf6f83117a17781dfc682aa187061e4bc9011f..5bf54458b00a2d698f293546fb92f44685b60763 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluatorTest.java
@@ -311,7 +311,7 @@ public class ManagedPropertyEvaluatorTest extends AssertJUnit
         new ManagedPropertyEvaluator("def batchColumnNames():\n return ['A']");
     }
 
-    @Test(expectedExceptionsMessageRegExp = "Function updateFromBatchInput is not defined "
+    @Test(expectedExceptionsMessageRegExp = "Function updateFromRegistrationForm is not defined "
             + "although function inputWidgets is defined.", expectedExceptions = EvaluatorException.class)
     public void testScriptWithInputWidgetsFunctionButMissingUpdateFromBatchFunction()
     {
@@ -320,7 +320,7 @@ public class ManagedPropertyEvaluatorTest extends AssertJUnit
     }
 
     @Test(expectedExceptionsMessageRegExp = "Function updateFromBatchInput is not defined "
-            + "although functions batchColumnNames and inputWidgets are defined.", expectedExceptions = EvaluatorException.class)
+            + "although function batchColumnNames is defined.", expectedExceptions = EvaluatorException.class)
     public void testScriptWithInputWidgetsFunctionAndBatchColumnNamesFunctionButMissingUpdateFromBatchFunction()
     {
         new ManagedPropertyEvaluator("def inputWidgets():\n"
@@ -334,7 +334,7 @@ public class ManagedPropertyEvaluatorTest extends AssertJUnit
     {
         new ManagedPropertyEvaluator("def inputWidgets():\n"
                 + " return [inputWidgetFactory().createTextInputField('A'), None]\n"
-                + "def updateFromBatchInput():\n  None");
+                + "def updateFromRegistrationForm():\n  None");
     }
 
     @Test(expectedExceptionsMessageRegExp = "Function inputWidgets has returned a list where "
@@ -345,7 +345,7 @@ public class ManagedPropertyEvaluatorTest extends AssertJUnit
     {
         new ManagedPropertyEvaluator("def inputWidgets():\n"
                 + " return [inputWidgetFactory().createTextInputField('A'), 'B']\n"
-                + "def updateFromBatchInput():\n  None");
+                + "def updateFromRegistrationForm():\n  None");
     }
 
     @Test(expectedExceptionsMessageRegExp = "Function 'batchColumnNames' doesn't return a List "
@@ -361,7 +361,8 @@ public class ManagedPropertyEvaluatorTest extends AssertJUnit
     {
         new ManagedPropertyEvaluator("def inputWidgets():\n" + " f = inputWidgetFactory()\n"
                 + " w1 = f.createTextInputField('a')\n" + " w2 = f.createTextInputField('Alpha')\n"
-                + " w2.code = 'A'\n" + " return [w1, w2]\n" + "def updateFromBatchInput():\n  None");
+                + " w2.code = 'A'\n" + " return [w1, w2]\n"
+                + "def updateFromRegistrationForm():\n  None");
     }
 
     @Test
@@ -391,7 +392,7 @@ public class ManagedPropertyEvaluatorTest extends AssertJUnit
                 new ManagedPropertyEvaluator(
                         "def inputWidgets():\n"
                                 + " return [inputWidgetFactory().createComboBoxInputField('Field', ['A', 'B'])]\n"
-                                + "def updateFromBatchInput():\n  None");
+                                + "def updateFromRegistrationForm():\n  None");
         assertEquals("[FIELD]", evaluator.getBatchColumnNames().toString());
         List<IManagedInputWidgetDescription> inputWidgetDescriptions =
                 evaluator.getInputWidgetDescriptions();
@@ -411,7 +412,8 @@ public class ManagedPropertyEvaluatorTest extends AssertJUnit
                         "def batchColumnNames():\n return ['A', 'Beta']\n"
                                 + "def inputWidgets():\n"
                                 + " return [inputWidgetFactory().createComboBoxInputField('Field', ['A', 'B'])]\n"
-                                + "def updateFromBatchInput():\n  None");
+                                + "def updateFromBatchInput():\n  None\n"
+                                + "def updateFromRegistrationForm():\n  None");
         assertEquals("[A, BETA]", evaluator.getBatchColumnNames().toString());
         List<IManagedInputWidgetDescription> inputWidgetDescriptions =
                 evaluator.getInputWidgetDescriptions();
@@ -475,7 +477,7 @@ public class ManagedPropertyEvaluatorTest extends AssertJUnit
                 new ManagedPropertyEvaluator(
                         "def showRawValueInForms():\n return True\n"
                                 + "def inputWidgets():\n return [inputWidgetFactory().createTextInputField('A')]\n"
-                                + "def updateFromBatchInput():\n  None");
+                                + "def updateFromRegistrationForm():\n  None");
 
         assertEquals("[A]", evaluator.getBatchColumnNames().toString());
         assertEquals("[]", evaluator.getInputWidgetDescriptions().toString());