diff --git a/common/source/java/ch/systemsx/cisd/common/string/ReflectionStringTraverser.java b/common/source/java/ch/systemsx/cisd/common/string/ReflectionStringTraverser.java
index 2b4ae9466c42db455780331140c716726760125d..294e4bd09ee41a5e25dc114c01fb2398b12bc5e8 100644
--- a/common/source/java/ch/systemsx/cisd/common/string/ReflectionStringTraverser.java
+++ b/common/source/java/ch/systemsx/cisd/common/string/ReflectionStringTraverser.java
@@ -101,6 +101,9 @@ class ReflectionStringTraverser
             LogUtils.logErrorWithFailingAssertion(log,
                     "Cannot traverse primitive collections or primitives " + object);
             return;
+        } else if (isArrayList(object))
+        {
+            traverseArrayList(object);
         } else if (clazz.isArray())
         {
             traverseArray(clazz);
@@ -272,7 +275,7 @@ class ReflectionStringTraverser
     private boolean isMutable(Object element)
     {
         return isString(element) == false && element.getClass().isPrimitive() == false
-                && isStringCollection(element) == false;
+                && (isStringCollection(element) == false || isArrayList(element));
     }
 
     private Collection<String> visitStringCollection(Object collection)
@@ -319,6 +322,37 @@ class ReflectionStringTraverser
         }
     }
 
+    private void traverseArrayList(Object arrayListObject)
+    {
+        ArrayList<?> arrayList = (ArrayList<?>) arrayListObject;
+        int length = arrayList.size();
+
+        for (int index = 0; index < length; ++index)
+        {
+            Object element = arrayList.get(index);
+            if (element == null)
+            {
+                continue;
+            }
+            if (element.getClass().isPrimitive())
+            {
+                return; // do nothing
+            } else if (isString(element))
+            {
+                visitStringArrayListElement(arrayList, index, (String) element);
+            } else
+            {
+                if (isStringCollection(element))
+                {
+                    visitStringCollectionArrayListElement(arrayList, index, element);
+                } else
+                {
+                    traverseMutable(element, element.getClass());
+                }
+            }
+        }
+    }
+
     // array[index] contains collection of primitive types which will be modified if necessary
     private void visitStringCollectionArrayElement(Object array, int index, Object collection)
     {
@@ -326,6 +360,15 @@ class ReflectionStringTraverser
         Array.set(array, index, newCollection);
     }
 
+    // arrayList[index] contains collection of primitive types which will be modified if necessary
+    @SuppressWarnings("unchecked")
+    private void visitStringCollectionArrayListElement(@SuppressWarnings("rawtypes")
+    ArrayList arrayList, int index, Object collection)
+    {
+        Collection<String> newCollection = visitStringCollection(collection);
+        arrayList.set(index, newCollection);
+    }
+
     // array[index] contains a value of primitive type which will be modified if necessary
     private void visitStringArrayElement(Object array, int index, String element,
             Class<?> componentType)
@@ -337,6 +380,18 @@ class ReflectionStringTraverser
         }
     }
 
+    // arrayList[index] contains a value of primitive type which will be modified if necessary
+    @SuppressWarnings("unchecked")
+    private void visitStringArrayListElement(@SuppressWarnings("rawtypes")
+    ArrayList arrayList, int index, String element)
+    {
+        String newElement = tryVisitString(element);
+        if (newElement != null)
+        {
+            arrayList.set(index, newElement);
+        }
+    }
+
     private String tryVisitString(String element)
     {
         return visitor.tryVisit(element, element, null);
@@ -408,4 +463,9 @@ class ReflectionStringTraverser
     {
         return o instanceof Collection<?>;
     }
+
+    private static boolean isArrayList(final Object o)
+    {
+        return o instanceof ArrayList<?>;
+    }
 }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java
index 592f0bc147a5df82536313e1f75f982f0533fa6e..f25a2f455f97830e8d00acb10f359da4052c7fd9 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java
@@ -248,11 +248,11 @@ public class UploadingCommandTest extends AssertJUnit
         createTestData(LOCATION1);
         ds2 = createTestData(LOCATION2);
         ExternalData dataSet1 =
-                DataSetTranslator.translate(createDataSet("1"), "?", null,
+                DataSetTranslator.translate(createDataSet("1"), "?", null, null,
                         ExperimentTranslator.LoadableFields.PROPERTIES);
         System.out.println("ds1:" + dataSet1.getExperiment().getProperties());
         ExternalData dataSet2 =
-                DataSetTranslator.translate(createDataSet("2"), "?", null,
+                DataSetTranslator.translate(createDataSet("2"), "?", null, null,
                         ExperimentTranslator.LoadableFields.PROPERTIES);
         dataSets = Arrays.<ExternalData> asList(dataSet1, dataSet2);
         command =
diff --git a/openbis/.classpath b/openbis/.classpath
index 5684b185ea441e5be7b482c72418a0a9f8a97697..fa44191e62846e008c706965cebb7b4c9dd561cb 100644
--- a/openbis/.classpath
+++ b/openbis/.classpath
@@ -32,7 +32,7 @@
 	<classpathentry kind="lib" path="/libraries/javassist/javassist.jar" sourcepath="/libraries/javassist/src.zip"/>
 	<classpathentry kind="lib" path="/libraries/lucene/lucene-core.jar" sourcepath="/libraries/lucene/lucene-2.4.1-src.zip"/>
 	<classpathentry kind="lib" path="/libraries/commons-fileupload/commons-fileupload.jar" sourcepath="/libraries/commons-fileupload/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/lucene-highlighter/lucene-highlighter.jar"/>
+	<classpathentry kind="lib" path="/libraries/lucene-highlighter/lucene-highlighter.jar" sourcepath="/libraries/lucene-highlighter/lucene-highlighter-javadoc.jar"/>
 	<classpathentry kind="lib" path="/libraries/apgdiff/apgdiff.jar" sourcepath="/libraries/apgdiff/src.zip"/>
 	<classpathentry kind="lib" path="/libraries/cisd-base/cisd-base.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip"/>
 	<classpathentry kind="lib" path="/libraries/eodsql/eodsql.jar" sourcepath="/libraries/eodsql/eodsql_src.zip"/>
@@ -82,5 +82,6 @@
 	<classpathentry kind="lib" path="/libraries/jetty8/lib/server/jetty-deploy.jar"/>
 	<classpathentry kind="lib" path="/libraries/jetty8/lib/server/jetty-webapp.jar"/>
 	<classpathentry kind="lib" path="/libraries/lucene-queries/lucene-queries.jar"/>
+	<classpathentry kind="lib" path="/libraries/cisd-hotdeploy/cisd-hotdeploy.jar" sourcepath="/libraries/cisd-hotdeploy/cisd-hotdeploy-src.zip"/>
 	<classpathentry kind="output" path="targets/www/WEB-INF/classes"/>
 </classpath>
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index 37381b14fb7a57af6c16db1086a3ea33dcd3f227..f36bb6220a625f8a4be4bd4fac8c6dae523d2cfc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -107,6 +107,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
@@ -1263,4 +1264,9 @@ public interface ICommonClientService extends IClientService
      * already exists.
      */
     public void registerMetaProject(String name) throws UserFailureException;
+
+    /**
+     * Lists all the available predeployed plugin names for given script type.
+     */
+    public List<String> listPredeployedPlugins(ScriptType scriptType);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index ad07a1702184b3452de7eb2c0a05a2ee24a6b8cd..ad07130e9922648df67d5977cbd74310298f403a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -109,6 +109,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
@@ -1102,7 +1103,7 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
             AsyncCallback<String> callback);
 
     /**
-     * @see ICommonClientService#evaluate(DynamicPropertyEvaluationInfo)
+     * @see ICommonClientService#evaluate(EntityValidationEvaluationInfo)
      */
     public void evaluate(EntityValidationEvaluationInfo entityValidationEvaluationInfo,
             AsyncCallback<String> callback);
@@ -1155,4 +1156,9 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
      * @see ICommonClientService#registerMetaProject(String)
      */
     public void registerMetaProject(String name, AsyncCallback<Void> callback);
+
+    /**
+     * @see ICommonClientService#listPredeployedPlugins(ScriptType)
+     */
+    public void listPredeployedPlugins(ScriptType scriptType, AsyncCallback<List<String>> callback);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
index 2bd458523d75d2821bbc8304c64faae369af70a8..e45fe158f99c768810fb08408c2540375e5779bd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
@@ -1060,6 +1060,8 @@ public abstract class Dict
 
     public static final String SCRIPT_TYPE = "script_type";
 
+    public static final String PLUGIN_TYPE = "plugin_type";
+
     //
     // Material Chooser
     //
@@ -1407,5 +1409,9 @@ public abstract class Dict
 
     public static final String PROGRESS_PROCESSING = "progress_processing";
 
+    // Predeployed plugins
+
+    public static final String PREDEPLOYED_PLUGIN_NAME = "predeployed_plugin_name";
+
     // ----- end generic ------------------
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/property_type/PluginTypeSelectionWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/property_type/PluginTypeSelectionWidget.java
new file mode 100644
index 0000000000000000000000000000000000000000..862248ee78d7a52fa507d6b04969015f4d055645
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/property_type/PluginTypeSelectionWidget.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
+
+/**
+ * @author Pawel Glyzewski
+ */
+public class PluginTypeSelectionWidget extends SimpleComboBox<PluginType>
+{
+    /** creates a combo box with all script types */
+    public static PluginTypeSelectionWidget createAllPluginTypes(
+            final IViewContext<ICommonClientServiceAsync> viewContext)
+    {
+        return new PluginTypeSelectionWidget(viewContext.getMessage(Dict.PLUGIN_TYPE),
+                viewContext.getMessage(Dict.PLUGIN_TYPE), viewContext.getMessage(
+                        Dict.COMBO_BOX_CHOOSE, "plugin type"), Arrays.asList(PluginType.values()));
+    }
+
+    private PluginTypeSelectionWidget(final String fieldLabel, final String toolTip,
+            final String chooseText, final List<PluginType> pluginTypes)
+    {
+        setFieldLabel(fieldLabel);
+        setTriggerAction(TriggerAction.ALL);
+        GWTUtils.setToolTip(this, toolTip);
+        GWTUtils.setupAutoWidth(this);
+        setEmptyText(chooseText);
+        setEditable(false);
+        setForceSelection(true);
+        add(pluginTypes);
+        GWTUtils.autoselect(this);
+        setId("plugin-type-selection");
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/property_type/PredeployedPluginSelectionWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/property_type/PredeployedPluginSelectionWidget.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee1aa14b2a12f8464b7fbd8e4e69a4611df145e9
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/property_type/PredeployedPluginSelectionWidget.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.DropDownList;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
+
+/**
+ * @author Pawel Glyzewski
+ */
+public class PredeployedPluginSelectionWidget extends
+        DropDownList<SimpleComboValue<String>, String>
+{
+    private final IViewContext<?> viewContext;
+
+    private ScriptType scriptType = ScriptType.DYNAMIC_PROPERTY;
+
+    public PredeployedPluginSelectionWidget(IViewContext<?> viewContext)
+    {
+        super(viewContext, "-predeployed-plugin-names", Dict.PREDEPLOYED_PLUGIN_NAME, "value",
+                "plugin", "plugins");
+
+        this.viewContext = viewContext;
+    }
+
+    @Override
+    public DatabaseModificationKind[] getRelevantModifications()
+    {
+        return DatabaseModificationKind.EMPTY_ARRAY;
+    }
+
+    @Override
+    protected void loadData(AbstractAsyncCallback<List<String>> callback)
+    {
+        viewContext.getCommonService().listPredeployedPlugins(scriptType,
+                new ListPredeployedPluginsCallback(viewContext));
+        callback.ignore();
+    }
+
+    @Override
+    protected List<SimpleComboValue<String>> convertItems(List<String> pluginNames)
+    {
+        ArrayList<SimpleComboValue<String>> results = new ArrayList<SimpleComboValue<String>>();
+
+        for (String pluginName : pluginNames)
+        {
+            results.add(new SimpleComboValue<String>(pluginName)
+                {
+                    private static final long serialVersionUID = 1L;
+                });
+        }
+
+        return results;
+    }
+
+    public void updateScriptType(@SuppressWarnings("hiding")
+    ScriptType scriptType)
+    {
+        if (scriptType != this.scriptType)
+        {
+            this.scriptType = scriptType;
+            refreshStore();
+            clearSelections();
+        }
+    }
+
+    public void setSelectedValue(String value)
+    {
+        setSelection(convertItems(Collections.singletonList(value)));
+    }
+
+    private class ListPredeployedPluginsCallback extends
+            PredeployedPluginSelectionWidget.ListItemsCallback
+    {
+
+        protected ListPredeployedPluginsCallback(IViewContext<?> viewContext)
+        {
+            super(viewContext);
+        }
+
+        @Override
+        public void process(List<String> result)
+        {
+            super.process(result);
+        }
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/AbstractScriptEditRegisterForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/AbstractScriptEditRegisterForm.java
index c33d443ce2a3a0aca82a3ab86f8c1cb301292549..8a40225eb3e2697ed6982f2222b3c990c3c9a91f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/AbstractScriptEditRegisterForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/AbstractScriptEditRegisterForm.java
@@ -32,6 +32,7 @@ import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
 import com.extjs.gxt.ui.client.widget.form.TextField;
 import com.extjs.gxt.ui.client.widget.form.Validator;
 import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
 import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
 import com.google.gwt.user.client.Element;
 
@@ -44,10 +45,14 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.D
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.MultilineVarcharField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ScriptField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.VarcharField;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PluginTypeSelectionWidget;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PredeployedPluginSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.ScriptTypeSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractRegistrationDialog;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 
@@ -58,11 +63,14 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
  */
 abstract public class AbstractScriptEditRegisterForm extends AbstractRegistrationForm
 {
-
     protected final IViewContext<ICommonClientServiceAsync> viewContext;
 
     protected final ScriptTypeSelectionWidget scriptTypeChooserOrNull;
 
+    protected final PluginTypeSelectionWidget pluginTypeChooserOrNull;
+
+    protected final PredeployedPluginSelectionWidget predeployedPluginsWidget;
+
     protected final TextField<String> nameField;
 
     protected final DescriptionField descriptionField;
@@ -71,7 +79,7 @@ abstract public class AbstractScriptEditRegisterForm extends AbstractRegistratio
 
     protected EntityKindSelectionWidget entityKindField;
 
-    private ScriptExecutionFramework scriptExecution;
+    protected ScriptExecutionFramework scriptExecution;
 
     abstract protected void saveScript();
 
@@ -82,36 +90,59 @@ abstract public class AbstractScriptEditRegisterForm extends AbstractRegistratio
     protected AbstractScriptEditRegisterForm(
             final IViewContext<ICommonClientServiceAsync> viewContext, EntityKind entityKindOrNull)
     {
-        this(viewContext, null, entityKindOrNull);
+        this(viewContext, null, null, entityKindOrNull);
     }
 
     public AbstractScriptEditRegisterForm(IViewContext<ICommonClientServiceAsync> viewContext,
-            ScriptTypeSelectionWidget scriptTypeChooser, EntityKind entityKindOrNull)
+            ScriptTypeSelectionWidget scriptTypeChooser,
+            PluginTypeSelectionWidget pluginTypeChooser, EntityKind entityKindOrNull)
     {
-        this(viewContext, null, scriptTypeChooser, entityKindOrNull);
+        this(viewContext, null, scriptTypeChooser, pluginTypeChooser, entityKindOrNull);
     }
 
     protected AbstractScriptEditRegisterForm(
             final IViewContext<ICommonClientServiceAsync> viewContext, TechId scriptIdOrNull,
-            ScriptTypeSelectionWidget scriptTypeChooserOrNull, EntityKind entityKindOrNull)
+            ScriptTypeSelectionWidget scriptTypeChooserOrNull,
+            PluginTypeSelectionWidget pluginTypeChooserOrNull, EntityKind entityKindOrNull)
     {
         super(viewContext, createId(scriptIdOrNull), DEFAULT_LABEL_WIDTH + 20, DEFAULT_FIELD_WIDTH);
         this.viewContext = viewContext;
 
+        this.predeployedPluginsWidget = new PredeployedPluginSelectionWidget(viewContext);
+        this.predeployedPluginsWidget.setVisible(false);
+
         this.scriptTypeChooserOrNull = scriptTypeChooserOrNull;
-        if (scriptTypeChooserOrNull != null)
+        this.pluginTypeChooserOrNull = pluginTypeChooserOrNull;
+        if (scriptTypeChooserOrNull != null || pluginTypeChooserOrNull != null)
         {
-            scriptTypeChooserOrNull.setWidth(200);
-            final ToolBar toolBar = new ToolBar();
-            toolBar.add(new LabelToolItem(scriptTypeChooserOrNull.getFieldLabel()
-                    + GenericConstants.LABEL_SEPARATOR));
-            toolBar.add(scriptTypeChooserOrNull);
+            ToolBar toolBar = null;
+            toolBar = new ToolBar();
             setTopComponent(toolBar);
-            scriptTypeChooserOrNull.addSelectionChangedListener(createScriptTypeChangedListener());
+
+            if (scriptTypeChooserOrNull != null)
+            {
+                scriptTypeChooserOrNull.setWidth(200);
+                toolBar.add(new LabelToolItem(scriptTypeChooserOrNull.getFieldLabel()
+                        + GenericConstants.LABEL_SEPARATOR));
+                toolBar.add(scriptTypeChooserOrNull);
+                scriptTypeChooserOrNull
+                        .addSelectionChangedListener(createScriptTypeChangedListener());
+            }
+
+            if (pluginTypeChooserOrNull != null)
+            {
+                pluginTypeChooserOrNull.setWidth(200);
+                toolBar.add(new SeparatorToolItem());
+                toolBar.add(new LabelToolItem(pluginTypeChooserOrNull.getFieldLabel()
+                        + GenericConstants.LABEL_SEPARATOR));
+                toolBar.add(pluginTypeChooserOrNull);
+                pluginTypeChooserOrNull
+                        .addSelectionChangedListener(createPluginTypeChangedListener());
+            }
         }
 
         this.nameField = new VarcharField(viewContext.getMessage(Dict.NAME), true);
-        this.nameField.setId(getId()+"-script-registration-name");
+        this.nameField.setId(getId() + "-script-registration-name");
         this.scriptExecution =
                 new ScriptExecutionFramework(viewContext, asValidable(formPanel), entityKindOrNull);
         this.entityKindField =
@@ -127,20 +158,33 @@ abstract public class AbstractScriptEditRegisterForm extends AbstractRegistratio
                             scriptExecution.updateEntityKind(entityKindField.tryGetEntityKind());
                         }
                     });
-        entityKindField.setId(getId()+"-script-registration-entity-kind");
+        entityKindField.setId(getId() + "-script-registration-entity-kind");
         this.descriptionField = AbstractRegistrationDialog.createDescriptionField(viewContext);
-        this.descriptionField.setId(getId()+"-script-registration-description");
+        this.descriptionField.setId(getId() + "-script-registration-description");
         this.scriptField = createScriptField(viewContext);
-        this.scriptField.setId(getId()+"-script-registration-script-content");
+        this.scriptField.setId(getId() + "-script-registration-script-content");
 
-        scriptField.addListener(Events.Change, new Listener<BaseEvent>()
+        Listener<BaseEvent> scriptParametersListener = new Listener<BaseEvent>()
             {
                 @Override
                 public void handleEvent(BaseEvent be)
                 {
-                    scriptExecution.update(scriptField.getValue());
+                    PluginType pluginTypeOrNull = null;
+                    if (AbstractScriptEditRegisterForm.this.pluginTypeChooserOrNull != null)
+                    {
+                        pluginTypeOrNull =
+                                AbstractScriptEditRegisterForm.this.pluginTypeChooserOrNull
+                                        .getSimpleValue();
+                    }
+                    scriptExecution.update(nameField.isVisible() ? nameField.getValue()
+                            : predeployedPluginsWidget.getValue().getValue(), scriptField
+                            .getValue(), pluginTypeOrNull);
                 }
-            });
+            };
+
+        scriptField.addListener(Events.Change, scriptParametersListener);
+        nameField.addListener(Events.Change, scriptParametersListener);
+        predeployedPluginsWidget.addListener(Events.Change, scriptParametersListener);
     }
 
     private SelectionChangedListener<SimpleComboValue<ScriptType>> createScriptTypeChangedListener()
@@ -153,18 +197,51 @@ abstract public class AbstractScriptEditRegisterForm extends AbstractRegistratio
                     SimpleComboValue<ScriptType> selectedItem = se.getSelectedItem();
                     if (selectedItem != null)
                     {
-                        onScriptTypeChanged(selectedItem.getValue());
+                        onPluginOrScriptTypeChanged(pluginTypeChooserOrNull.getSimpleValue(),
+                                selectedItem.getValue());
                     }
                 }
             };
     }
 
-    protected void onScriptTypeChanged(ScriptType scriptType)
+    private SelectionChangedListener<SimpleComboValue<PluginType>> createPluginTypeChangedListener()
     {
+        return new SelectionChangedListener<SimpleComboValue<PluginType>>()
+            {
+                @Override
+                public void selectionChanged(SelectionChangedEvent<SimpleComboValue<PluginType>> se)
+                {
+                    SimpleComboValue<PluginType> selectedItem = se.getSelectedItem();
+                    if (selectedItem != null)
+                    {
+                        onPluginOrScriptTypeChanged(selectedItem.getValue(),
+                                scriptTypeChooserOrNull.getSimpleValue());
+                    }
+                }
+            };
+    }
+
+    protected void onPluginOrScriptTypeChanged(PluginType pluginType, ScriptType scriptType)
+    {
+        predeployedPluginsWidget.updateScriptType(scriptType);
+        nameField.setVisible(pluginType == PluginType.JYTHON);
+        FieldUtil.setMandatoryFlag(nameField, pluginType == PluginType.JYTHON);
+        predeployedPluginsWidget.setVisible(pluginType == PluginType.PREDEPLOYED);
+        FieldUtil.setMandatoryFlag(predeployedPluginsWidget, pluginType == PluginType.PREDEPLOYED);
+        scriptField.setVisible(pluginType == PluginType.JYTHON);
+        scriptField.setEnabled(pluginType == PluginType.JYTHON);
         rightPanel.setVisible(scriptType == ScriptType.DYNAMIC_PROPERTY
                 || scriptType == ScriptType.ENTITY_VALIDATION);
         this.scriptExecution.setScriptType(scriptType);
-        scriptField.setValidator(validatorsByScriptType.get(scriptType));
+        if (pluginType == PluginType.JYTHON)
+        {
+            scriptField.setValidator(validatorsByScriptType.get(scriptType));
+        } else
+        {
+            scriptField.setValidator(null);
+        }
+
+        scriptExecution.update(nameField.getValue(), scriptField.getValue(), pluginType);
     }
 
     private IValidable asValidable(final FormPanel panel)
@@ -199,11 +276,13 @@ abstract public class AbstractScriptEditRegisterForm extends AbstractRegistratio
     {
         super.resetPanel();
         nameField.reset();
+        predeployedPluginsWidget.reset();
     }
 
     private final void addFormFields()
     {
         formPanel.add(nameField);
+        formPanel.add(predeployedPluginsWidget);
         formPanel.add(entityKindField);
         formPanel.add(descriptionField);
         formPanel.add(scriptField);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptEditForm.java
index cda5e0a075fbae2505543490c0eb2d0d6bac85a9..ad5fe39b9a31cfd3ff9d8eafe7ec3ecba51faf11 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptEditForm.java
@@ -24,7 +24,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericCon
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
 
 /**
@@ -41,7 +43,7 @@ public class ScriptEditForm extends AbstractScriptEditRegisterForm
 
     protected ScriptEditForm(IViewContext<ICommonClientServiceAsync> viewContext, TechId scriptId)
     {
-        super(viewContext, scriptId, null, null);
+        super(viewContext, scriptId, null, null, null);
         setRevertButtonVisible(true);
         this.scriptId = scriptId;
     }
@@ -59,17 +61,31 @@ public class ScriptEditForm extends AbstractScriptEditRegisterForm
         Script script = new Script();
         script.setId(scriptId.getId());
         script.setDescription(descriptionField.getValue());
-        script.setScript(scriptField.getValue());
-        script.setName(nameField.getValue());
+        if (originalScript.getPluginType() == PluginType.JYTHON)
+        {
+            script.setScript(scriptField.getValue());
+            script.setName(nameField.getValue());
+        } else
+        {
+            script.setName(predeployedPluginsWidget.getValue().getValue());
+        }
         return script;
     }
 
     @Override
     protected void setValues()
     {
+        predeployedPluginsWidget.updateScriptType(originalScript.getScriptType());
         FieldUtil.setValueWithUnescaping(descriptionField, originalScript.getDescription());
         FieldUtil.setValueWithUnescaping(scriptField, originalScript.getScript());
-        FieldUtil.setValueWithUnescaping(nameField, originalScript.getName());
+        if (originalScript.getPluginType() == PluginType.JYTHON)
+        {
+            FieldUtil.setValueWithUnescaping(nameField, originalScript.getName());
+        } else
+        {
+            predeployedPluginsWidget.setSelectedValue(StringEscapeUtils.unescapeHtml(originalScript
+                    .getName()));
+        }
         String entityKind =
                 originalScript.getEntityKind() == null ? GenericConstants.ALL_ENTITY_KINDS
                         : originalScript.getEntityKind().name();
@@ -93,7 +109,8 @@ public class ScriptEditForm extends AbstractScriptEditRegisterForm
     void setOriginalScript(Script script)
     {
         this.originalScript = script;
-        onScriptTypeChanged(script.getScriptType());
+        onPluginOrScriptTypeChanged(script.getPluginType(), script.getScriptType());
+        scriptExecution.update(script.getName(), script.getScript(), script.getPluginType());
     }
 
     private final class ScriptEditCallback extends
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptExecutionFramework.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptExecutionFramework.java
index b1b451265b5a01748861a529ea0cd8ebb8e0df19..1d28f948bffd8a83bab797b29a474f7d9c15653e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptExecutionFramework.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptExecutionFramework.java
@@ -61,6 +61,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DynamicPropertyEvaluationInfo;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityValidationEvaluationInfo;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 
 /**
@@ -99,8 +100,12 @@ public class ScriptExecutionFramework
 
     private static class State
     {
+        private String scriptName;
+
         private String script;
 
+        private PluginType pluginType;
+
         public String getScript()
         {
             return script;
@@ -111,6 +116,25 @@ public class ScriptExecutionFramework
             this.script = script;
         }
 
+        public PluginType getPluginType()
+        {
+            return pluginType;
+        }
+
+        public void setPluginType(PluginType pluginType)
+        {
+            this.pluginType = pluginType;
+        }
+
+        public String getScriptName()
+        {
+            return scriptName;
+        }
+
+        public void setScriptName(String scriptName)
+        {
+            this.scriptName = scriptName;
+        }
     }
 
     public ScriptExecutionFramework(IViewContext<ICommonClientServiceAsync> viewContext,
@@ -318,9 +342,15 @@ public class ScriptExecutionFramework
         return set;
     }
 
-    public void update(String script)
+    public void update(String scriptName, String script, PluginType pluginTypeOrNull)
     {
+        state.setScriptName(scriptName);
         state.setScript(script);
+
+        if (pluginTypeOrNull != null)
+        {
+            state.setPluginType(pluginTypeOrNull);
+        }
     }
 
     public void updateEntityKind(EntityKind kind)
@@ -341,45 +371,25 @@ public class ScriptExecutionFramework
         if (selectedEntityOrNull != null)
         {
             evaluate(selectedEntityOrNull.getEntityKind(),
-                    selectedEntityOrNull.getEntityIdentifier(), state.getScript());
+                    selectedEntityOrNull.getEntityIdentifier(), state.getPluginType(),
+                    state.getScriptName(), state.getScript());
         }
     }
 
-    private void evaluate(EntityKind kind, String entity, String script)
+    private void evaluate(EntityKind kind, String entity, PluginType pluginType, String scriptName,
+            String script)
     {
         if (entity == null)
         {
             return;
         }
         if (this.scriptType == ScriptType.DYNAMIC_PROPERTY)
-        {
-            updateEvaluationResultField(viewContext.getMessage(Dict.EVALUATION_IN_PROGRESS));
-            viewContext.getCommonService().evaluate(
-                    new DynamicPropertyEvaluationInfo(kind, entity, script),
-                    new AbstractAsyncCallback<String>(viewContext)
-                        {
-
-                            @Override
-                            protected void process(String result)
-                            {
-                                updateEvaluationResultField(result);
-                            }
-
-                            @Override
-                            public void finishOnFailure(Throwable caught)
-                            {
-                                updateEvaluationResultField("");
-                                evaluationResultPanel.setVisible(false);
-                            }
-                        });
-        } else if (this.scriptType == ScriptType.ENTITY_VALIDATION)
         {
             updateEvaluationResultField(viewContext.getMessage(Dict.EVALUATION_IN_PROGRESS));
             viewContext.getCommonService()
                     .evaluate(
-                            new EntityValidationEvaluationInfo(kind, entity,
-                                    isNewEntity.getValue(), script),
-                            new AbstractAsyncCallback<String>(viewContext)
+                            new DynamicPropertyEvaluationInfo(kind, entity, pluginType, scriptName,
+                                    script), new AbstractAsyncCallback<String>(viewContext)
                                 {
 
                                     @Override
@@ -395,6 +405,28 @@ public class ScriptExecutionFramework
                                         evaluationResultPanel.setVisible(false);
                                     }
                                 });
+        } else if (this.scriptType == ScriptType.ENTITY_VALIDATION)
+        {
+            updateEvaluationResultField(viewContext.getMessage(Dict.EVALUATION_IN_PROGRESS));
+            viewContext.getCommonService().evaluate(
+                    new EntityValidationEvaluationInfo(kind, entity, isNewEntity.getValue(),
+                            pluginType, scriptName, script),
+                    new AbstractAsyncCallback<String>(viewContext)
+                        {
+
+                            @Override
+                            protected void process(String result)
+                            {
+                                updateEvaluationResultField(result);
+                            }
+
+                            @Override
+                            public void finishOnFailure(Throwable caught)
+                            {
+                                updateEvaluationResultField("");
+                                evaluationResultPanel.setVisible(false);
+                            }
+                        });
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptRegistrationForm.java
index 2d93d1d5857885901af4e12eeb79c96283333b82..cc14056accec125b3a89cf1121841a8a3027d134 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptRegistrationForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptRegistrationForm.java
@@ -19,8 +19,10 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PluginTypeSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.ScriptTypeSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
 
 /**
@@ -34,13 +36,17 @@ public class ScriptRegistrationForm extends AbstractScriptEditRegisterForm
     {
         ScriptTypeSelectionWidget scriptTypeChooser =
                 ScriptTypeSelectionWidget.createAllScriptTypes(viewContext);
-        return new ScriptRegistrationForm(viewContext, scriptTypeChooser, entityKindOrNull);
+        PluginTypeSelectionWidget pluginTypeChooser =
+                PluginTypeSelectionWidget.createAllPluginTypes(viewContext);
+        return new ScriptRegistrationForm(viewContext, scriptTypeChooser, pluginTypeChooser,
+                entityKindOrNull);
     }
 
     protected ScriptRegistrationForm(IViewContext<ICommonClientServiceAsync> viewContext,
-            ScriptTypeSelectionWidget scriptTypeChooser, EntityKind entityKindOrNull)
+            ScriptTypeSelectionWidget scriptTypeChooser,
+            PluginTypeSelectionWidget pluginTypeChooser, EntityKind entityKindOrNull)
     {
-        super(viewContext, scriptTypeChooser, entityKindOrNull);
+        super(viewContext, scriptTypeChooser, pluginTypeChooser, entityKindOrNull);
         setResetButtonVisible(true);
     }
 
@@ -55,11 +61,20 @@ public class ScriptRegistrationForm extends AbstractScriptEditRegisterForm
     @Override
     public Script getScript()
     {
+        PluginType pluginType = pluginTypeChooserOrNull.getSimpleValue();
+
         Script newScript = new Script();
         newScript.setDescription(descriptionField.getValue());
-        newScript.setName(nameField.getValue());
-        newScript.setScript(scriptField.getValue());
+        if (pluginType == PluginType.JYTHON)
+        {
+            newScript.setScript(scriptField.getValue());
+            newScript.setName(nameField.getValue());
+        } else
+        {
+            newScript.setName(predeployedPluginsWidget.getValue().getValue());
+        }
         newScript.setScriptType(scriptTypeChooserOrNull.getSimpleValue());
+        newScript.setPluginType(pluginType);
         newScript.setEntityKind(entityKindField.tryGetEntityKind());
         return newScript;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 923fe27448d1065ba00a49176a2f1e1ca67742c0..1887894ccfca2b1a6ee85d0a2b3e47172190e632 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -187,6 +187,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
@@ -2805,4 +2806,10 @@ public final class CommonClientService extends AbstractClientService implements
         metaproject.setName(name);
         commonServer.registerMetaproject(getSessionToken(), metaproject);
     }
+
+    @Override
+    public List<String> listPredeployedPlugins(ScriptType scriptType)
+    {
+        return commonServer.listPredeployedPlugins(getSessionToken(), scriptType);
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
index d17ec12802a32e21806ad2c5e539272880ba6b55..9bb6d8c1ad61015d79f3be80f5b85e7ec6adb8a6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
@@ -51,7 +51,6 @@ import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.ReturnVa
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ExpressionValidator;
 import ch.systemsx.cisd.openbis.generic.server.business.IPropertiesBatchManager;
-import ch.systemsx.cisd.openbis.generic.server.business.PropertiesBatchManager;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataSetTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IDataSetTable;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
@@ -158,6 +157,7 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp
     @Resource(name = ExposablePropertyPlaceholderConfigurer.PROPERTY_CONFIGURER_BEAN_NAME)
     protected ExposablePropertyPlaceholderConfigurer configurer;
 
+    @Resource(name = ComponentNames.PROPERTIES_BATCH_MANAGER)
     private IPropertiesBatchManager propertiesBatchManager;
 
     private String userForAnonymousLogin;
@@ -198,10 +198,6 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp
 
     protected IPropertiesBatchManager getPropertiesBatchManager()
     {
-        if (propertiesBatchManager == null)
-        {
-            propertiesBatchManager = new PropertiesBatchManager();
-        }
         return propertiesBatchManager;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
index c5fa9d66aa246a88602e1e537ea7cf4b3faee787..56f73e4fc133bf3f7e03ecdac36f2ef8994df931 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
@@ -87,6 +87,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.IMasterDataScriptRegistrationRunner;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * The unique {@link ICommonBusinessObjectFactory} implementation.
@@ -100,41 +101,43 @@ public final class CommonBusinessObjectFactory extends AbstractBusinessObjectFac
     public CommonBusinessObjectFactory(IDAOFactory daoFactory, IDataStoreServiceFactory dssFactory,
             IRelationshipService relationshipService,
             IEntityOperationChecker entityOperationChecker,
-            IServiceConversationClientManagerLocal conversationClient)
+            IServiceConversationClientManagerLocal conversationClient,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         super(daoFactory, dssFactory, relationshipService, entityOperationChecker,
-                conversationClient);
+                conversationClient, managedPropertyEvaluatorFactory);
     }
 
     @Override
     public final IAttachmentBO createAttachmentBO(final Session session)
     {
-        return new AttachmentBO(getDaoFactory(), session);
+        return new AttachmentBO(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public final ISpaceBO createSpaceBO(final Session session)
     {
-        return new SpaceBO(getDaoFactory(), session);
+        return new SpaceBO(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public final IScriptBO createScriptBO(final Session session)
     {
-        return new ScriptBO(getDaoFactory(), session);
+        return new ScriptBO(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public final IRoleAssignmentTable createRoleAssignmentTable(final Session session)
     {
-        return new RoleAssignmentTable(getDaoFactory(), session);
+        return new RoleAssignmentTable(getDaoFactory(), session,
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public final ISampleTable createSampleTable(final Session session)
     {
         return new SampleTable(getDaoFactory(), session, getRelationshipService(),
-                getEntityOperationChecker());
+                getEntityOperationChecker(), getManagedPropertyEvaluatorFactory());
     }
 
     @Override
@@ -174,132 +177,142 @@ public final class CommonBusinessObjectFactory extends AbstractBusinessObjectFac
     public final ISampleBO createSampleBO(final Session session)
     {
         return new SampleBO(getDaoFactory(), session, getRelationshipService(),
-                getEntityOperationChecker());
+                getEntityOperationChecker(), getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IDataBO createDataBO(Session session)
     {
         return new DataBO(getDaoFactory(), session, getRelationshipService(),
-                getConversationClient());
+                getConversationClient(), getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public final IDataSetTable createDataSetTable(final Session session)
     {
         return new DataSetTable(getDaoFactory(), getDSSFactory(), session,
-                getRelationshipService(), getConversationClient());
+                getRelationshipService(), getConversationClient(),
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IDeletedDataSetTable createDeletedDataSetTable(Session session)
     {
         return new DeletedDataSetTable(getDaoFactory(), getDSSFactory(), session,
-                getRelationshipService(), getConversationClient());
+                getRelationshipService(), getConversationClient(),
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IExperimentTable createExperimentTable(final Session session)
     {
-        return new ExperimentTable(getDaoFactory(), session, getRelationshipService());
+        return new ExperimentTable(getDaoFactory(), session, getRelationshipService(),
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IMaterialTable createMaterialTable(final Session session)
     {
-        return new MaterialTable(getDaoFactory(), session);
+        return new MaterialTable(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public final IExperimentBO createExperimentBO(final Session session)
     {
-        return new ExperimentBO(getDaoFactory(), session, getRelationshipService());
+        return new ExperimentBO(getDaoFactory(), session, getRelationshipService(),
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public final IPropertyTypeTable createPropertyTypeTable(final Session session)
     {
-        return new PropertyTypeTable(getDaoFactory(), session);
+        return new PropertyTypeTable(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public final IPropertyTypeBO createPropertyTypeBO(final Session session)
     {
-        return new PropertyTypeBO(getDaoFactory(), session);
+        return new PropertyTypeBO(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public final IVocabularyBO createVocabularyBO(Session session)
     {
-        return new VocabularyBO(getDaoFactory(), session);
+        return new VocabularyBO(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public final IVocabularyTermBO createVocabularyTermBO(Session session)
     {
-        return new VocabularyTermBO(getDaoFactory(), session);
+        return new VocabularyTermBO(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IEntityTypePropertyTypeBO createEntityTypePropertyTypeBO(Session session,
             EntityKind entityKind)
     {
-        return new EntityTypePropertyTypeBO(getDaoFactory(), session, entityKind);
+        return new EntityTypePropertyTypeBO(getDaoFactory(), session, entityKind,
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IProjectBO createProjectBO(Session session)
     {
-        return new ProjectBO(getDaoFactory(), session, getRelationshipService());
+        return new ProjectBO(getDaoFactory(), session, getRelationshipService(),
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IEntityTypeBO createEntityTypeBO(Session session)
     {
-        return new EntityTypeBO(getDaoFactory(), session);
+        return new EntityTypeBO(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IMaterialBO createMaterialBO(Session session)
     {
-        return new MaterialBO(getDaoFactory(), session);
+        return new MaterialBO(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IAuthorizationGroupBO createAuthorizationGroupBO(Session session)
     {
-        return new AuthorizationGroupBO(getDaoFactory(), session);
+        return new AuthorizationGroupBO(getDaoFactory(), session,
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IGridCustomFilterOrColumnBO createGridCustomFilterBO(Session session)
     {
-        return new GridCustomFilterBO(getDaoFactory(), session);
+        return new GridCustomFilterBO(getDaoFactory(), session,
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IGridCustomFilterOrColumnBO createGridCustomColumnBO(Session session)
     {
-        return new GridCustomColumnBO(getDaoFactory(), session);
+        return new GridCustomColumnBO(getDaoFactory(), session,
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public ITrashBO createTrashBO(Session session)
     {
-        return new TrashBO(getDaoFactory(), this, session);
+        return new TrashBO(getDaoFactory(), this, session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public IDeletionTable createDeletionTable(Session session)
     {
-        return new DeletionTable(getDaoFactory(), session);
+        return new DeletionTable(getDaoFactory(), session, getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public ICorePluginTable createCorePluginTable(Session session,
             IMasterDataScriptRegistrationRunner masterDataScriptRunner)
     {
-        return new CorePluginTable(getDaoFactory(), session, masterDataScriptRunner);
+        return new CorePluginTable(getDaoFactory(), session, masterDataScriptRunner,
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
@@ -312,7 +325,8 @@ public final class CommonBusinessObjectFactory extends AbstractBusinessObjectFac
     public IMetaprojectBO createMetaprojectBO(Session session)
     {
         return new MetaprojectBO(getDaoFactory(), createExperimentBO(session),
-                createSampleBO(session), createDataBO(session), createMaterialBO(session), session);
+                createSampleBO(session), createDataBO(session), createMaterialBO(session), session,
+                getManagedPropertyEvaluatorFactory());
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 5c09d2b7ae42421dd823d7c66c58c028b6c06fd9..ff0a516316f23cc3cb589f9a219041a504331ca4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -133,13 +133,15 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.HibernateSearchDataProvider;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.SampleDataAccessExceptionTranslator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.DynamicPropertyEvaluator;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.IDynamicPropertyCalculatorFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.IDynamicPropertyEvaluator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.EntityAdaptorFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.INonAbstractEntityAdapter;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.JythonDynamicPropertyCalculator;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.JythonEntityValidationCalculator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.JythonEntityValidationCalculator.IValidationRequestDelegate;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityAdaptor;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.IEntityValidatorFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.api.IEntityValidator;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.EncapsulatedCommonServer;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.MasterDataRegistrationScriptRunner;
 import ch.systemsx.cisd.openbis.generic.server.util.SpaceIdentifierHelper;
@@ -304,7 +306,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierF
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluator;
-import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.AttachmentTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.AuthorizationGroupTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
@@ -342,16 +344,26 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
     private final IDataStoreServiceRegistrator dataStoreServiceRegistrator;
 
+    private final IEntityValidatorFactory entityValidationFactory;
+
+    private final IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory;
+
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     private String defaultPutDataStoreServerCodeOrNull;
 
     public CommonServer(final IAuthenticationService authenticationService,
             final ISessionManager<Session> sessionManager, final IDAOFactory daoFactory,
             final ICommonBusinessObjectFactory businessObjectFactory,
             IDataStoreServiceRegistrator dataStoreServiceRegistrator,
-            final LastModificationState lastModificationState)
+            final LastModificationState lastModificationState,
+            IEntityValidatorFactory entityValidationFactory,
+            IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this(authenticationService, sessionManager, daoFactory, null, businessObjectFactory,
-                dataStoreServiceRegistrator, lastModificationState);
+                dataStoreServiceRegistrator, lastModificationState, entityValidationFactory,
+                dynamicPropertyCalculatorFactory, managedPropertyEvaluatorFactory);
     }
 
     CommonServer(final IAuthenticationService authenticationService,
@@ -359,12 +371,18 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
             IPropertiesBatchManager propertiesBatchManager,
             final ICommonBusinessObjectFactory businessObjectFactory,
             IDataStoreServiceRegistrator dataStoreServiceRegistrator,
-            final LastModificationState lastModificationState)
+            final LastModificationState lastModificationState,
+            IEntityValidatorFactory entityValidationFactory,
+            IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         super(authenticationService, sessionManager, daoFactory, propertiesBatchManager,
                 businessObjectFactory);
         this.dataStoreServiceRegistrator = dataStoreServiceRegistrator;
         this.lastModificationState = lastModificationState;
+        this.entityValidationFactory = entityValidationFactory;
+        this.dynamicPropertyCalculatorFactory = dynamicPropertyCalculatorFactory;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     ICommonBusinessObjectFactory getBusinessObjectFactory()
@@ -653,7 +671,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
             if (entityTypePropertyType.isManaged())
             {
                 IManagedPropertyEvaluator evaluator =
-                        ManagedPropertyEvaluatorFactory
+                        managedPropertyEvaluatorFactory
                                 .createManagedPropertyEvaluator(entityTypePropertyType);
                 List<IManagedInputWidgetDescription> inputWidgetDescriptions =
                         evaluator.getInputWidgetDescriptions();
@@ -867,7 +885,8 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         List<AbstractEntityPropertyHistoryPE> result =
                 entityPropertyHistoryDAO.getPropertyHistory(
                         DtoConverters.convertEntityKind(entityKind), entityID);
-        return EntityHistoryTranslator.translate(result, session.getBaseIndexURL());
+        return EntityHistoryTranslator.translate(result, session.getBaseIndexURL(),
+                managedPropertyEvaluatorFactory);
     }
 
     private static List<EntityTypePropertyType<?>> extractAssignments(EntityType entityTypeOrNull,
@@ -953,8 +972,8 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
         Metaproject metaproject = getMetaproject(sessionToken, metaprojectId);
         Collection<MetaprojectAssignmentPE> assignments =
-                new MetaprojectAssignmentsHelper(getDAOFactory()).getMetaprojectAssignments(
-                        metaproject.getId(), EntityKind.EXPERIMENT);
+                new MetaprojectAssignmentsHelper(getDAOFactory(), managedPropertyEvaluatorFactory)
+                        .getMetaprojectAssignments(metaproject.getId(), EntityKind.EXPERIMENT);
         List<ExperimentPE> experimentsPE = new ArrayList<ExperimentPE>();
 
         for (MetaprojectAssignmentPE assignment : assignments)
@@ -1042,7 +1061,8 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         Map<Long, Set<Metaproject>> assignments =
                 MetaprojectTranslator.translateMetaprojectAssignments(assignmentPEs);
         Collections.sort(experiments);
-        return ExperimentTranslator.translate(experiments, session.getBaseIndexURL(), assignments);
+        return ExperimentTranslator.translate(experiments, session.getBaseIndexURL(), assignments,
+                managedPropertyEvaluatorFactory);
     }
 
     private final List<Experiment> listExperiments(final String sessionToken,
@@ -1079,7 +1099,8 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         Map<Long, Set<Metaproject>> assignments =
                 MetaprojectTranslator.translateMetaprojectAssignments(assignmentPEs);
         Collections.sort(experiments);
-        return ExperimentTranslator.translate(experiments, session.getBaseIndexURL(), assignments);
+        return ExperimentTranslator.translate(experiments, session.getBaseIndexURL(), assignments,
+                managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -1488,7 +1509,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                 getDAOFactory().getMetaprojectDAO().listMetaprojectsForEntity(
                         session.tryGetPerson(), dataset);
         return DataSetTranslator.translate(dataset, session.getBaseIndexURL(),
-                MetaprojectTranslator.translate(metaprojectPEs));
+                MetaprojectTranslator.translate(metaprojectPEs), managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -1536,7 +1557,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         {
             HibernateUtils.initialize(hit.getChildRelationships());
             list.add(DataSetTranslator.translate(hit, session.getBaseIndexURL(), withDetails,
-                    translation.get(hit.getId())));
+                    translation.get(hit.getId()), managedPropertyEvaluatorFactory));
         }
         return list;
     }
@@ -1569,7 +1590,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         {
             HibernateUtils.initialize(hit.getChildRelationships());
             list.add(DataSetTranslator.translate(hit, session.getBaseIndexURL(), withDetails,
-                    translation.get(hit.getId())));
+                    translation.get(hit.getId()), managedPropertyEvaluatorFactory));
         }
         return list;
     }
@@ -2252,7 +2273,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                         session.tryGetPerson(), sample);
         return SampleTranslator.translate(getSampleTypeSlaveServerPlugin(sample.getSampleType())
                 .getSampleInfo(session, sample), session.getBaseIndexURL(), MetaprojectTranslator
-                .translate(metaprojectPEs));
+                .translate(metaprojectPEs), managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -2298,7 +2319,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                         session.tryGetPerson(), experiment);
 
         return ExperimentTranslator.translate(experiment, session.getBaseIndexURL(),
-                MetaprojectTranslator.translate(metaprojects),
+                MetaprojectTranslator.translate(metaprojects), managedPropertyEvaluatorFactory,
                 ExperimentTranslator.LoadableFields.PROPERTIES,
                 ExperimentTranslator.LoadableFields.ATTACHMENTS);
     }
@@ -2321,7 +2342,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                         session.tryGetPerson(), experiment);
 
         return ExperimentTranslator.translate(experiment, session.getBaseIndexURL(),
-                MetaprojectTranslator.translate(metaprojects),
+                MetaprojectTranslator.translate(metaprojects), managedPropertyEvaluatorFactory,
                 ExperimentTranslator.LoadableFields.PROPERTIES,
                 ExperimentTranslator.LoadableFields.ATTACHMENTS);
     }
@@ -2396,7 +2417,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                         session.tryGetPerson(), materialPE);
 
         return MaterialTranslator.translate(materialPE,
-                MetaprojectTranslator.translate(metaprojectPEs));
+                MetaprojectTranslator.translate(metaprojectPEs), managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -2412,7 +2433,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                 getDAOFactory().getMetaprojectDAO().listMetaprojectsForEntity(
                         session.tryGetPerson(), material);
         return MaterialTranslator.translate(material, true,
-                MetaprojectTranslator.translate(metaprojectPEs));
+                MetaprojectTranslator.translate(metaprojectPEs), managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -2729,7 +2750,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                 if (etpt.isManaged())
                 {
                     IManagedPropertyEvaluator evaluator =
-                            ManagedPropertyEvaluatorFactory.createManagedPropertyEvaluator(etpt);
+                            managedPropertyEvaluatorFactory.createManagedPropertyEvaluator(etpt);
                     List<String> batchColumnNames = evaluator.getBatchColumnNames();
                     if (batchColumnNames.isEmpty())
                     {
@@ -3232,7 +3253,8 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
             JythonDynamicPropertyCalculator calculator =
                     JythonDynamicPropertyCalculator.create(info.getScript());
             IDynamicPropertyEvaluator evaluator =
-                    new DynamicPropertyEvaluator(getDAOFactory(), null);
+                    new DynamicPropertyEvaluator(getDAOFactory(), null,
+                            dynamicPropertyCalculatorFactory, managedPropertyEvaluatorFactory);
             IEntityAdaptor adaptor =
                     EntityAdaptorFactory.create(entity, evaluator, getDAOFactory()
                             .getSessionFactory().getCurrentSession());
@@ -3254,28 +3276,28 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         {
             final List<String> objectsWhichValidationWouldBeForced = new LinkedList<String>();
 
-            JythonEntityValidationCalculator calculator =
-                    JythonEntityValidationCalculator.create(info.getScript(),
-                            new IValidationRequestDelegate<INonAbstractEntityAdapter>()
-                                {
-                                    @Override
-                                    public void requestValidation(
-                                            INonAbstractEntityAdapter entityAdaptor)
-                                    {
-                                        IEntityInformationWithPropertiesHolder localEntity =
-                                                entityAdaptor.entityPE();
-                                        objectsWhichValidationWouldBeForced.add(localEntity
-                                                .getEntityKind()
-                                                + " "
-                                                + localEntity.getIdentifier());
-                                    }
-                                });
+            IEntityValidator entityValidator =
+                    entityValidationFactory.createEntityValidator(info.getPluginType(),
+                            info.getScriptName(), info.getScript());
+            entityValidator.init(new IValidationRequestDelegate<INonAbstractEntityAdapter>()
+                {
+                    @Override
+                    public void requestValidation(INonAbstractEntityAdapter entityAdaptor)
+                    {
+                        IEntityInformationWithPropertiesHolder localEntity =
+                                entityAdaptor.entityPE();
+                        objectsWhichValidationWouldBeForced.add(localEntity.getEntityKind() + " "
+                                + localEntity.getIdentifier());
+                    }
+                });
+
             IDynamicPropertyEvaluator evaluator =
-                    new DynamicPropertyEvaluator(getDAOFactory(), null);
+                    new DynamicPropertyEvaluator(getDAOFactory(), null,
+                            dynamicPropertyCalculatorFactory, managedPropertyEvaluatorFactory);
             IEntityAdaptor adaptor =
                     EntityAdaptorFactory.create(entity, evaluator, getDAOFactory()
                             .getSessionFactory().getCurrentSession());
-            String result = calculator.eval(adaptor, info.isNew());
+            String result = entityValidator.validate(adaptor, info.isNew());
 
             if (result != null)
             {
@@ -3467,7 +3489,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
         }
 
-        return ManagedPropertyEvaluatorFactory.createManagedPropertyEvaluator(managedPropertyPE
+        return managedPropertyEvaluatorFactory.createManagedPropertyEvaluator(managedPropertyPE
                 .getEntityTypePropertyType());
     }
 
@@ -3952,7 +3974,8 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
         Session session = getSession(sessionToken);
 
-        MetaprojectAssignmentsHelper helper = new MetaprojectAssignmentsHelper(getDAOFactory());
+        MetaprojectAssignmentsHelper helper =
+                new MetaprojectAssignmentsHelper(getDAOFactory(), managedPropertyEvaluatorFactory);
 
         return helper.getMetaprojectAssignments(session, metaproject, session.getUserName(),
                 fetchOptions);
@@ -4130,4 +4153,22 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         return new AuthorizationServiceUtils(getDAOFactory(), session.tryGetPerson());
     }
 
+    @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public List<String> listPredeployedPlugins(String sessionToken, ScriptType scriptType)
+    {
+        checkSession(sessionToken);
+
+        switch (scriptType)
+        {
+            case ENTITY_VALIDATION:
+                return entityValidationFactory.listPredeployedPlugins();
+            case DYNAMIC_PROPERTY:
+                return dynamicPropertyCalculatorFactory.listPredeployedPlugins();
+            case MANAGED_PROPERTY:
+                return managedPropertyEvaluatorFactory.listPredeployedPlugins();
+        }
+
+        return null;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index 32f00e6e4cbbabc005a6ac14f04e51ffe75812c2..0cef93173076884e59fe2ef54019fbd1f6d9b791 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -1685,4 +1685,11 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
                 metaprojectId, notNullUpdate.getName(), notNullUpdate.getDescription());
         return null;
     }
+
+    @Override
+    public List<String> listPredeployedPlugins(String sessionToken, ScriptType scriptType)
+    {
+        logAccess(sessionToken, "list_predeployed_plugins", "SCRIPT_TYPE(%s)", scriptType);
+        return null;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ComponentNames.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ComponentNames.java
index 86e46556c4e39c57e43ab9253dd5470367099691..2f4c6c8b40d17c63766bbf4554545248399a1048 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ComponentNames.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ComponentNames.java
@@ -44,4 +44,9 @@ public final class ComponentNames
     public static final String COMMON_BUSINESS_OBJECT_FACTORY = "common-business-object-factory";
 
     public static final String REMOTE_HOST_VALIDATOR = "remote-host-validator";
+
+    public static final String MANAGED_PROPERTY_EVALUATOR_FACTORY =
+            "managed-property-evaluator-factory";
+
+    public static final String PROPERTIES_BATCH_MANAGER = "properties-batch-manager";
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
index ba99c6fa3ae6697a47c44e066e501bee6e5c86ad..6063902862ac3de9ade96b4f2a47093ca09bcc7a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
@@ -220,6 +220,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTypePropertyTypeTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTypeTranslator;
@@ -268,13 +269,16 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
 
     private IServiceConversationServerManagerLocal conversationServer;
 
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     public ETLService(IAuthenticationService authenticationService,
             ISessionManager<Session> sessionManager, IDAOFactory daoFactory,
             ICommonBusinessObjectFactory boFactory, IDataStoreServiceFactory dssFactory,
             TrustedCrossOriginDomainsProvider trustedOriginDomainProvider,
             IETLEntityOperationChecker entityOperationChecker,
             IDataStoreServiceRegistrator dataStoreServiceRegistrator,
-            IDataStoreDataSourceManager dataSourceManager)
+            IDataStoreDataSourceManager dataSourceManager,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this(authenticationService, sessionManager, daoFactory, null, boFactory, dssFactory,
                 trustedOriginDomainProvider, entityOperationChecker, dataStoreServiceRegistrator,
@@ -287,7 +291,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
                                 {
                                     return null;
                                 }
-                            }), 30));
+                            }), 30), managedPropertyEvaluatorFactory);
     }
 
     ETLService(IAuthenticationService authenticationService,
@@ -298,7 +302,8 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
             IETLEntityOperationChecker entityOperationChecker,
             IDataStoreServiceRegistrator dataStoreServiceRegistrator,
             IDataStoreDataSourceManager dataSourceManager,
-            ISessionManager<Session> sessionManagerForEntityOperation)
+            ISessionManager<Session> sessionManagerForEntityOperation,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         super(authenticationService, sessionManager, daoFactory, propertiesBatchManager, boFactory);
         this.daoFactory = daoFactory;
@@ -308,6 +313,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         this.dataStoreServiceRegistrator = dataStoreServiceRegistrator;
         this.dataSourceManager = dataSourceManager;
         this.sessionManagerForEntityOperation = sessionManagerForEntityOperation;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     @Override
@@ -539,7 +545,8 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
                         session.tryGetPerson(), experiment);
 
         return ExperimentTranslator.translate(experiment, session.getBaseIndexURL(),
-                MetaprojectTranslator.translate(metaprojectPEs), LoadableFields.PROPERTIES);
+                MetaprojectTranslator.translate(metaprojectPEs), managedPropertyEvaluatorFactory,
+                LoadableFields.PROPERTIES);
     }
 
     @Override
@@ -576,7 +583,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
                             session.tryGetPerson(), sample);
         }
         return SampleTranslator.translate(sample, session.getBaseIndexURL(), true, true,
-                MetaprojectTranslator.translate(metaprojects));
+                MetaprojectTranslator.translate(metaprojects), managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -768,7 +775,8 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         Map<Long, Set<Metaproject>> assignments =
                 MetaprojectTranslator.translateMetaprojectAssignments(assignmentPEs);
         Collections.sort(experiments);
-        return ExperimentTranslator.translate(experiments, session.getBaseIndexURL(), assignments);
+        return ExperimentTranslator.translate(experiments, session.getBaseIndexURL(), assignments,
+                managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -793,7 +801,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         Set<SamplePropertyPE> properties = top.getProperties();
         HibernateUtils.initialize(properties);
         return EntityPropertyTranslator.translate(properties.toArray(new SamplePropertyPE[0]),
-                new HashMap<PropertyTypePE, PropertyType>());
+                new HashMap<PropertyTypePE, PropertyType>(), managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -817,7 +825,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         Set<SamplePropertyPE> properties = sample.getProperties();
         HibernateUtils.initialize(properties);
         return EntityPropertyTranslator.translate(properties.toArray(new SamplePropertyPE[0]),
-                new HashMap<PropertyTypePE, PropertyType>());
+                new HashMap<PropertyTypePE, PropertyType>(), managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -1071,7 +1079,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
                 getDAOFactory().getMetaprojectDAO().listMetaprojectsForEntity(
                         session.tryGetPerson(), dataPE);
         return DataSetTranslator.translate(dataPE, session.getBaseIndexURL(),
-                MetaprojectTranslator.translate(metaprojects));
+                MetaprojectTranslator.translate(metaprojects), managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -1142,7 +1150,8 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         Map<Long, Set<Metaproject>> assignments =
                 MetaprojectTranslator.translateMetaprojectAssignments(assignmentPEs);
 
-        return SampleTranslator.translate(samples, "", assignments);
+        return SampleTranslator
+                .translate(samples, "", assignments, managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -1341,7 +1350,9 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
 
         // Register the data set
         registerDataSetInternal(sessionToken, externalData, samplePE);
-        Sample result = SampleTranslator.translate(samplePE, session.getBaseIndexURL(), null);
+        Sample result =
+                SampleTranslator.translate(samplePE, session.getBaseIndexURL(), null,
+                        managedPropertyEvaluatorFactory);
         return result;
     }
 
@@ -1366,7 +1377,8 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
 
         Sample result =
                 SampleTranslator.translate(samplePE, session.getBaseIndexURL(),
-                        MetaprojectTranslator.translate(metaprojectPEs));
+                        MetaprojectTranslator.translate(metaprojectPEs),
+                        managedPropertyEvaluatorFactory);
         return result;
     }
 
@@ -1485,7 +1497,8 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
                                 session.tryGetPerson(), materialPE);
             }
             return MaterialTranslator.translate(materialPE,
-                    MetaprojectTranslator.translate(metaprojectPEs));
+                    MetaprojectTranslator.translate(metaprojectPEs),
+                    managedPropertyEvaluatorFactory);
         } catch (UserFailureException ufe)
         {
             // material does not exist
@@ -1698,7 +1711,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
     {
         MaterialHelper materialHelper =
                 new MaterialHelper(session, businessObjectFactory, getDAOFactory(),
-                        getPropertiesBatchManager());
+                        getPropertiesBatchManager(), managedPropertyEvaluatorFactory);
         Map<String, List<NewMaterial>> materialRegs = operationDetails.getMaterialRegistrations();
         if (authorize)
         {
@@ -1720,7 +1733,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
     {
         MaterialHelper materialHelper =
                 new MaterialHelper(session, businessObjectFactory, getDAOFactory(),
-                        getPropertiesBatchManager());
+                        getPropertiesBatchManager(), managedPropertyEvaluatorFactory);
 
         List<MaterialUpdateDTO> allMaterialUpdates = operationDetails.getMaterialUpdates();
 
@@ -2590,7 +2603,8 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
                     name);
         }
 
-        MetaprojectAssignmentsHelper helper = new MetaprojectAssignmentsHelper(daoFactory);
+        MetaprojectAssignmentsHelper helper =
+                new MetaprojectAssignmentsHelper(daoFactory, managedPropertyEvaluatorFactory);
         return helper.getMetaprojectAssignments(getSession(systemSessionToken), metaproject,
                 userName, fetchOptions);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/HotDeploymentController.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/HotDeploymentController.java
new file mode 100644
index 0000000000000000000000000000000000000000..234bc7dfb9a93d43b555bbfab951bee0516d2187
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/HotDeploymentController.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server;
+
+import java.io.File;
+
+import ch.ethz.cisd.hotdeploy.PluginContainer;
+import ch.ethz.cisd.hotdeploy.PluginMapHolder;
+
+/**
+ * @author Pawel Glyzewski
+ */
+public class HotDeploymentController implements IHotDeploymentController
+{
+    private final PluginContainer pluginContainer;
+
+    public HotDeploymentController()
+    {
+        PluginContainer.initHotDeployment();
+        pluginContainer = PluginContainer.tryGetInstance();
+    }
+
+    @Override
+    public void addPluginDirectory(File pluginDirectory)
+    {
+        pluginContainer.addPluginDirectory(pluginDirectory);
+    }
+
+    @Override
+    public <T> PluginMapHolder<T> getPluginMap(Class<T> pluginClass)
+    {
+        return new PluginMapHolder<T>(pluginContainer, pluginClass);
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IHotDeploymentController.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IHotDeploymentController.java
new file mode 100644
index 0000000000000000000000000000000000000000..237ea73426732f8db4bb2c10123be7998437e478
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IHotDeploymentController.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server;
+
+import java.io.File;
+
+import ch.ethz.cisd.hotdeploy.PluginMapHolder;
+
+/**
+ * @author Pawel Glyzewski
+ */
+public interface IHotDeploymentController
+{
+    public void addPluginDirectory(File pluginDirectory);
+
+    public <T> PluginMapHolder<T> getPluginMap(Class<T> pluginClass);
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MaterialHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MaterialHelper.java
index 2427c2b75978d5b3d789da61342af3d00b191f0b..ee5366944c2bedec45c753ea78ff3fa47584e88b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MaterialHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MaterialHelper.java
@@ -50,6 +50,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MaterialTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MaterialTypeTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.util.MaterialConfigurationProvider;
@@ -74,22 +75,27 @@ public class MaterialHelper
 
     private final MaterialConfigurationProvider materialConfig;
 
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     public MaterialHelper(Session session, IAbstractBussinessObjectFactory businessObjectFactory,
-            IDAOFactory daoFactory, IPropertiesBatchManager propertiesBatchManager)
+            IDAOFactory daoFactory, IPropertiesBatchManager propertiesBatchManager,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this(session, businessObjectFactory, daoFactory, propertiesBatchManager,
-                MaterialConfigurationProvider.getInstance());
+                MaterialConfigurationProvider.getInstance(), managedPropertyEvaluatorFactory);
     }
 
     MaterialHelper(Session session, IAbstractBussinessObjectFactory businessObjectFactory,
             IDAOFactory daoFactory, IPropertiesBatchManager propertiesBatchManager,
-            MaterialConfigurationProvider materialConfig)
+            MaterialConfigurationProvider materialConfig,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.session = session;
         this.businessObjectFactory = businessObjectFactory;
         this.daoFactory = daoFactory;
         this.propertiesBatchManager = propertiesBatchManager;
         this.materialConfig = materialConfig;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     public List<Material> registerMaterials(String materialTypeCode,
@@ -142,7 +148,7 @@ public class MaterialHelper
         BatchOperationExecutor.executeInBatches(strategy);
 
         return MaterialTranslator.translate(registeredMaterials,
-                new HashMap<Long, Set<Metaproject>>());
+                new HashMap<Long, Set<Metaproject>>(), managedPropertyEvaluatorFactory);
     }
 
     public int updateMaterials(String materialTypeCode, final List<NewMaterial> newMaterials,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MetaprojectAssignmentsHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MetaprojectAssignmentsHelper.java
index 653e96d7fb41aebc784ea1805810f8d7829bd066..d686cdea8138658806674682e7ef28faf4022647 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MetaprojectAssignmentsHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MetaprojectAssignmentsHelper.java
@@ -33,6 +33,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignmentsF
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DtoConverters;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
@@ -47,9 +48,13 @@ public class MetaprojectAssignmentsHelper
 {
     private final IDAOFactory daoFactory;
 
-    public MetaprojectAssignmentsHelper(IDAOFactory daoFactory)
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
+    public MetaprojectAssignmentsHelper(IDAOFactory daoFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.daoFactory = daoFactory;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     /**
@@ -86,7 +91,7 @@ public class MetaprojectAssignmentsHelper
                 {
                     experiments.add(ExperimentTranslator.translate(
                             metaprojectAssignmentPE.getExperiment(), baseIndexURL, null,
-                            LoadableFields.PROPERTIES));
+                            managedPropertyEvaluatorFactory, LoadableFields.PROPERTIES));
                 } else
                 {
                     experiments.add(ExperimentTranslator.translateWithoutRevealingData(
@@ -103,7 +108,7 @@ public class MetaprojectAssignmentsHelper
                 if (authorizationUtils.canAccessSample(metaprojectAssignmentPE.getSample()))
                 {
                     samples.add(SampleTranslator.translate(metaprojectAssignmentPE.getSample(),
-                            baseIndexURL, null));
+                            baseIndexURL, null, managedPropertyEvaluatorFactory));
                 } else
                 {
                     samples.add(SampleTranslator
@@ -120,7 +125,7 @@ public class MetaprojectAssignmentsHelper
                 if (authorizationUtils.canAccessDataSet(metaprojectAssignmentPE.getDataSet()))
                 {
                     dataSets.add(DataSetTranslator.translate(metaprojectAssignmentPE.getDataSet(),
-                            baseIndexURL, null));
+                            baseIndexURL, null, managedPropertyEvaluatorFactory));
                 } else
                 {
                     dataSets.add(DataSetTranslator
@@ -135,7 +140,7 @@ public class MetaprojectAssignmentsHelper
                     metaproject.getId(), EntityKind.MATERIAL))
             {
                 materials.add(MaterialTranslator.translate(metaprojectAssignmentPE.getMaterial(),
-                        null));
+                        null, managedPropertyEvaluatorFactory));
             }
         }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
index 29db281fdfadf5a5966e8ea2df4a82e5f375c7a6..f3380ddf4b2d7328d7c611e5101cfd3b1faf0fc2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
@@ -109,6 +109,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MetaprojectTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
@@ -128,6 +129,9 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Resource(name = ComponentNames.COMMON_BUSINESS_OBJECT_FACTORY)
     private ICommonBusinessObjectFactory boFactory;
 
+    @Resource(name = ComponentNames.MANAGED_PROPERTY_EVALUATOR_FACTORY)
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     // Default constructor needed by Spring
     public GeneralInformationService()
     {
@@ -819,7 +823,8 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
                             session.tryGetPerson(), dataPE);
             ExternalData ds =
                     DataSetTranslator.translate(dataPE, session.getBaseIndexURL(),
-                            MetaprojectTranslator.translate(metaprojects));
+                            MetaprojectTranslator.translate(metaprojects),
+                            managedPropertyEvaluatorFactory);
             result.add(Translator.translate(ds, connections));
         }
         return result;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/PropertiesBatchManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/PropertiesBatchManager.java
index da90b14d60fcbdfd11343a9fb9f8b79c76c84e31..a950799d580455108fb2cef637eb8566c156f754 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/PropertiesBatchManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/PropertiesBatchManager.java
@@ -50,7 +50,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluator;
-import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyFunctions;
 import ch.systemsx.cisd.openbis.generic.shared.translator.PersonTranslator;
 
@@ -71,6 +71,13 @@ public class PropertiesBatchManager implements IPropertiesBatchManager
 
     private final Logger notificationLog = LogFactory.getLogger(LogCategory.NOTIFY, getClass());
 
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
+    public PropertiesBatchManager(IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
+    {
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
+    }
+
     @Override
     public void manageProperties(SampleTypePE sampleType, List<NewSample> samples,
             PersonPE registrator)
@@ -261,7 +268,7 @@ public class PropertiesBatchManager implements IPropertiesBatchManager
                 String propertyTypeCode = entityTypePropertyType.getPropertyType().getCode();
                 EvaluationContext context = new EvaluationContext();
                 context.evaluator =
-                        ManagedPropertyEvaluatorFactory
+                        managedPropertyEvaluatorFactory
                                 .createManagedPropertyEvaluator(entityTypePropertyType);
                 context.scriptPEorNull = entityTypePropertyType.getScript();
                 result.put(propertyTypeCode, context);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
index 22177203364bd4de78ce2f0da4dcc5a551d9200c..35242920086fe4ccc051ffe0eac4ca265af5d350 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
@@ -89,6 +89,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.AttachmentTranslator;
 
 /**
@@ -104,20 +105,27 @@ abstract class AbstractBusinessObject implements IDAOFactory
 
     protected final IEntityPropertiesConverter entityPropertiesConverter;
 
-    AbstractBusinessObject(final IDAOFactory daoFactory, final Session session)
+    protected final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
+    AbstractBusinessObject(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        this(daoFactory, session, (IEntityPropertiesConverter) null);
+        this(daoFactory, session, (IEntityPropertiesConverter) null,
+                managedPropertyEvaluatorFactory);
     }
 
     AbstractBusinessObject(final IDAOFactory daoFactory, final Session session,
-            EntityKind entityKindOrNull)
+            EntityKind entityKindOrNull,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this(daoFactory, session, entityKindOrNull == null ? null : new EntityPropertiesConverter(
-                entityKindOrNull, daoFactory));
+                entityKindOrNull, daoFactory, managedPropertyEvaluatorFactory),
+                managedPropertyEvaluatorFactory);
     }
 
     AbstractBusinessObject(final IDAOFactory daoFactory, final Session session,
-            IEntityPropertiesConverter converter)
+            IEntityPropertiesConverter converter,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         assert daoFactory != null : "Given DAO factory can not be null.";
         assert session != null : "Given session can not be null.";
@@ -125,6 +133,7 @@ abstract class AbstractBusinessObject implements IDAOFactory
         this.daoFactory = daoFactory;
         this.session = session;
         entityPropertiesConverter = converter;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObjectFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObjectFactory.java
index 6ec9d6ace49b5c195441e078b0a29c74dd36b150..3b97550f3b6d5b130e604350f613eee05f1a1893 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObjectFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObjectFactory.java
@@ -24,6 +24,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.IEntityOperationChecker;
 import ch.systemsx.cisd.openbis.generic.server.business.IRelationshipService;
 import ch.systemsx.cisd.openbis.generic.server.business.IServiceConversationClientManagerLocal;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * An <i>abstract</i> <i>Business Object</i> factory.
@@ -44,6 +45,9 @@ public abstract class AbstractBusinessObjectFactory
 
     private IServiceConversationClientManagerLocal conversationClient;
 
+    @Resource(name = ComponentNames.MANAGED_PROPERTY_EVALUATOR_FACTORY)
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     protected AbstractBusinessObjectFactory()
     {
     }
@@ -51,13 +55,15 @@ public abstract class AbstractBusinessObjectFactory
     protected AbstractBusinessObjectFactory(final IDAOFactory daoFactory,
             IDataStoreServiceFactory dssFactory, IRelationshipService relationshipService,
             IEntityOperationChecker entityOperationChecker,
-            IServiceConversationClientManagerLocal conversationClient)
+            IServiceConversationClientManagerLocal conversationClient,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.daoFactory = daoFactory;
         this.dssFactory = dssFactory;
         this.relationshipService = relationshipService;
         this.entityOperationChecker = entityOperationChecker;
         this.conversationClient = conversationClient;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     protected final IDAOFactory getDaoFactory()
@@ -85,4 +91,8 @@ public abstract class AbstractBusinessObjectFactory
         return conversationClient;
     }
 
+    protected IManagedPropertyEvaluatorFactory getManagedPropertyEvaluatorFactory()
+    {
+        return managedPropertyEvaluatorFactory;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractDataSetBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractDataSetBusinessObject.java
index 0186d8909d68a54642096081d72aa64c97b97b60..9f9170a1b671f7c3d047f8f0f90aba8f4703114b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractDataSetBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractDataSetBusinessObject.java
@@ -43,6 +43,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -57,9 +58,10 @@ public abstract class AbstractDataSetBusinessObject extends AbstractSampleIdenti
 
     public AbstractDataSetBusinessObject(IDAOFactory daoFactory, Session session,
             IRelationshipService relationshipService,
-            IServiceConversationClientManagerLocal conversationClient)
+            IServiceConversationClientManagerLocal conversationClient,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, EntityKind.DATA_SET);
+        super(daoFactory, session, EntityKind.DATA_SET, managedPropertyEvaluatorFactory);
         this.relationshipService = relationshipService;
         this.conversationClient = conversationClient;
     }
@@ -67,9 +69,10 @@ public abstract class AbstractDataSetBusinessObject extends AbstractSampleIdenti
     public AbstractDataSetBusinessObject(IDAOFactory daoFactory, Session session,
             IEntityPropertiesConverter entityPropertiesConverter,
             IRelationshipService relationshipService,
-            IServiceConversationClientManagerLocal conversationClient)
+            IServiceConversationClientManagerLocal conversationClient,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, entityPropertiesConverter);
+        super(daoFactory, session, entityPropertiesConverter, managedPropertyEvaluatorFactory);
         this.relationshipService = relationshipService;
         this.conversationClient = conversationClient;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractMaterialBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractMaterialBusinessObject.java
index 1563c2df65a1e4d41786df386bec6748378e1764..7b926f9a7123206b52da7091ecac741ad66f5549 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractMaterialBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractMaterialBusinessObject.java
@@ -23,6 +23,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * Generic operations on materials.
@@ -31,15 +32,17 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
  */
 public class AbstractMaterialBusinessObject extends AbstractBusinessObject
 {
-    protected AbstractMaterialBusinessObject(final IDAOFactory daoFactory, final Session session)
+    protected AbstractMaterialBusinessObject(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, EntityKind.MATERIAL);
+        super(daoFactory, session, EntityKind.MATERIAL, managedPropertyEvaluatorFactory);
     }
 
     protected AbstractMaterialBusinessObject(final IDAOFactory daoFactory, final Session session,
-            final IEntityPropertiesConverter entityPropertiesConverter)
+            final IEntityPropertiesConverter entityPropertiesConverter,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, entityPropertiesConverter);
+        super(daoFactory, session, entityPropertiesConverter, managedPropertyEvaluatorFactory);
     }
 
     private static final String PROPERTY_TYPES = "materialType.materialTypePropertyTypesInternal";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
index b88636fe80e85e5b13d33653e905c2d5c56d2c2c..5458f9955514dcc5789e62a28db390eb6da09a6d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
@@ -61,6 +61,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleOwnerIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * An <i>abstract</i> {@link AbstractSampleIdentifierBusinessObject} extension for <i>Business
@@ -81,18 +82,22 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi
     protected IEntityOperationChecker entityOperationChecker;
 
     AbstractSampleBusinessObject(final IDAOFactory daoFactory, final Session session,
-            IRelationshipService relationshipService, IEntityOperationChecker entityOperationChecker)
+            IRelationshipService relationshipService,
+            IEntityOperationChecker entityOperationChecker,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, EntityKind.SAMPLE);
+        super(daoFactory, session, EntityKind.SAMPLE, managedPropertyEvaluatorFactory);
         this.relationshipService = relationshipService;
         this.entityOperationChecker = entityOperationChecker;
     }
 
     AbstractSampleBusinessObject(final IDAOFactory daoFactory, final Session session,
             final IEntityPropertiesConverter entityPropertiesConverter,
-            IRelationshipService relationshipService, IEntityOperationChecker entityOperationChecker)
+            IRelationshipService relationshipService,
+            IEntityOperationChecker entityOperationChecker,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, entityPropertiesConverter);
+        super(daoFactory, session, entityPropertiesConverter, managedPropertyEvaluatorFactory);
         this.relationshipService = relationshipService;
         this.entityOperationChecker = entityOperationChecker;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java
index 45648910e6267d798fcdc7fa2b4c06940587ffeb..9705934ffb01259faf69a49c880d81e3c758bf46 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -46,16 +47,17 @@ abstract class AbstractSampleIdentifierBusinessObject extends AbstractBusinessOb
     private final SampleOwnerFinder sampleOwnerFinder;
 
     AbstractSampleIdentifierBusinessObject(final IDAOFactory daoFactory, final Session session,
-            EntityKind entityKind)
+            EntityKind entityKind, IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, entityKind);
+        super(daoFactory, session, entityKind, managedPropertyEvaluatorFactory);
         sampleOwnerFinder = new SampleOwnerFinder(daoFactory, findPerson());
     }
 
     public AbstractSampleIdentifierBusinessObject(IDAOFactory daoFactory, Session session,
-            IEntityPropertiesConverter converter)
+            IEntityPropertiesConverter converter,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, converter);
+        super(daoFactory, session, converter, managedPropertyEvaluatorFactory);
         sampleOwnerFinder = new SampleOwnerFinder(daoFactory, findPerson());
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AttachmentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AttachmentBO.java
index 645d10304f8c0a0651ebcb25ea9fa48934172db5..e59b75e951bb3492c8fa65c4b42a24dc4cf71aff 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AttachmentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AttachmentBO.java
@@ -31,6 +31,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * The only productive implementation of {@link IAttachmentBO}.
@@ -43,9 +44,10 @@ public final class AttachmentBO extends AbstractBusinessObject implements IAttac
 
     private boolean dataChanged;
 
-    public AttachmentBO(final IDAOFactory daoFactory, final Session session)
+    public AttachmentBO(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBO.java
index 9a75cda25442509930eec8ef8ccf513c688016c2..a396e2b507e6dbabdae25d90ff7b546b3e0171bf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBO.java
@@ -36,6 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * {@link IAuthorizationGroupBO} implementation.
@@ -53,15 +54,18 @@ public class AuthorizationGroupBO extends AbstractBusinessObject implements IAut
 
     // For tests only
     @Private
-    AuthorizationGroupBO(IDAOFactory daoFactory, Session session, IAuthorizationGroupFactory factory)
+    AuthorizationGroupBO(IDAOFactory daoFactory, Session session,
+            IAuthorizationGroupFactory factory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
         this.groupFactory = factory;
     }
 
-    public AuthorizationGroupBO(IDAOFactory daoFactory, Session session)
+    public AuthorizationGroupBO(IDAOFactory daoFactory, Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        this(daoFactory, session, new AuthorizationGroupFactory());
+        this(daoFactory, session, new AuthorizationGroupFactory(), managedPropertyEvaluatorFactory);
     }
 
     interface IAuthorizationGroupFactory
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/CorePluginTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/CorePluginTable.java
index 06e633a22c877bd120bcbbfd05bf98b129f0bf62..7cf0a118d071b7c820448560d86d6d1b31ef698c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/CorePluginTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/CorePluginTable.java
@@ -35,6 +35,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CorePlugin;
 import ch.systemsx.cisd.openbis.generic.shared.coreplugin.ICorePluginResourceLoader;
 import ch.systemsx.cisd.openbis.generic.shared.dto.CorePluginPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.CorePluginTranslator;
 
 /**
@@ -52,9 +53,10 @@ public final class CorePluginTable extends AbstractBusinessObject implements ICo
     private final IMasterDataScriptRegistrationRunner masterDataScriptRunner;
 
     public CorePluginTable(IDAOFactory daoFactory, Session session,
-            IMasterDataScriptRegistrationRunner masterDataScriptRunner)
+            IMasterDataScriptRegistrationRunner masterDataScriptRunner,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
         this.masterDataScriptRunner = masterDataScriptRunner;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
index a655d4db873184a23d88a654731e1acee3703bba..c54ac5e329fac8d81e80623de12e8740bad6350d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
@@ -73,6 +73,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyTermPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.types.DataSetTypeCode;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -87,18 +88,21 @@ public class DataBO extends AbstractDataSetBusinessObject implements IDataBO
 
     public DataBO(IDAOFactory daoFactory, Session session,
             IRelationshipService relationshipService,
-            IServiceConversationClientManagerLocal conversationClient)
+            IServiceConversationClientManagerLocal conversationClient,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, relationshipService, conversationClient);
+        super(daoFactory, session, relationshipService, conversationClient,
+                managedPropertyEvaluatorFactory);
     }
 
     public DataBO(IDAOFactory daoFactory, Session exampleSession,
             IEntityPropertiesConverter propertiesConverter,
             IRelationshipService relationshipService,
-            IServiceConversationClientManagerLocal conversationClient)
+            IServiceConversationClientManagerLocal conversationClient,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         super(daoFactory, exampleSession, propertiesConverter, relationshipService,
-                conversationClient);
+                conversationClient, managedPropertyEvaluatorFactory);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
index 70195b80acb6b41c41fb06f856bdbffd53e349c5..3ab6f9248825a3fcc462d19487ec52a3d22a7205 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
@@ -71,6 +71,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
@@ -198,9 +199,11 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements
 
     public DataSetTable(IDAOFactory daoFactory, IDataStoreServiceFactory dssFactory,
             Session session, IRelationshipService relationshipService,
-            IServiceConversationClientManagerLocal conversationClient)
+            IServiceConversationClientManagerLocal conversationClient,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, relationshipService, conversationClient);
+        super(daoFactory, session, relationshipService, conversationClient,
+                managedPropertyEvaluatorFactory);
         this.dssFactory = dssFactory;
     }
 
@@ -449,7 +452,8 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements
                         session.getSessionToken());
         String sessionToken = dataStore.getSessionToken();
         List<ExternalData> cleanDataSets =
-                DataSetTranslator.translate(list, "?", "?", new HashMap<Long, Set<Metaproject>>());
+                DataSetTranslator.translate(list, "?", "?", new HashMap<Long, Set<Metaproject>>(),
+                        managedPropertyEvaluatorFactory);
         service.uploadDataSetsToCIFEX(sessionToken, cleanDataSets, context);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DeletedDataSetTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DeletedDataSetTable.java
index d67d7f704a8f374e620e86d859893585532624a7..7837537e847b6a9a9a2c5bfe67176ccc5b516c96 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DeletedDataSetTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DeletedDataSetTable.java
@@ -37,6 +37,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletedDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * BO for handling {@link DataPE}.
@@ -92,9 +93,11 @@ public final class DeletedDataSetTable extends AbstractDataSetBusinessObject imp
 
     public DeletedDataSetTable(final IDAOFactory daoFactory, IDataStoreServiceFactory dssFactory,
             final Session session, IRelationshipService relationshipService,
-            IServiceConversationClientManagerLocal conversationClient)
+            IServiceConversationClientManagerLocal conversationClient,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, relationshipService, conversationClient);
+        super(daoFactory, session, relationshipService, conversationClient,
+                managedPropertyEvaluatorFactory);
     }
 
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DeletionTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DeletionTable.java
index 4ddea9adba7afe7993343f6e1ff87a634631aff6..7ac99d3004de61c976c03a3f3005f7f3066da27f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DeletionTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DeletionTable.java
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IDeletablePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DeletionTranslator;
 
 /**
@@ -43,9 +44,10 @@ public class DeletionTable extends AbstractBusinessObject implements IDeletionTa
 {
     private List<Deletion> deletions;
 
-    public DeletionTable(IDAOFactory daoFactory, Session session)
+    public DeletionTable(IDAOFactory daoFactory, Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypeBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypeBO.java
index 4f63068c47c2e4f7f72d26498570bd29233fa3f4..256b2f3259b35a164e89f83500f57312dcef6399 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypeBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypeBO.java
@@ -37,6 +37,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * Manipulations on {@link EntityTypePE} subclasses.
@@ -66,9 +67,10 @@ public final class EntityTypeBO extends AbstractBusinessObject implements IEntit
 
     private EntityKind entityKind;
 
-    public EntityTypeBO(final IDAOFactory daoFactory, final Session session)
+    public EntityTypeBO(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     private ScriptPE getValidationScriptPE(EntityType entityType)
@@ -80,8 +82,8 @@ public final class EntityTypeBO extends AbstractBusinessObject implements IEntit
             return null;
         } else
         {
-            ScriptPE script = getScriptDAO()
-                    .tryFindByName(entityType.getValidationScript().getName());
+            ScriptPE script =
+                    getScriptDAO().tryFindByName(entityType.getValidationScript().getName());
 
             if (script != null && entityType.isEntityKind(script.getEntityKind()))
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
index 82a6d281f5ec3f2ae2a6e10f3046e5d1398808b5..eff254fe52c36c7d126701d6ccfb09d81b7d6928 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
@@ -40,6 +40,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * The unique {@link IEntityTypePropertyTypeBO} implementation.
@@ -61,17 +62,21 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements
 
     @Private
     EntityTypePropertyTypeBO(IDAOFactory daoFactory, Session session, EntityKind entityKind,
-            IEntityPropertiesConverter converter)
+            IEntityPropertiesConverter converter,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
         propertiesConverter = converter;
         this.entityKind = entityKind;
     }
 
-    public EntityTypePropertyTypeBO(IDAOFactory daoFactory, Session session, EntityKind entityKind)
+    public EntityTypePropertyTypeBO(IDAOFactory daoFactory, Session session, EntityKind entityKind,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
-        propertiesConverter = new EntityPropertiesConverter(entityKind, daoFactory);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
+        propertiesConverter =
+                new EntityPropertiesConverter(entityKind, daoFactory,
+                        managedPropertyEvaluatorFactory);
         this.entityKind = entityKind;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
index cd5310285a716a3dab49c257544ebb411efd9f46..b13eb1afb6b6be64b0c2ac7b334683a43791551b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
@@ -62,6 +62,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -88,16 +89,18 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
     private IRelationshipService relationshipService;
 
     public ExperimentBO(final IDAOFactory daoFactory, final Session session,
-            IRelationshipService relationshipService)
+            IRelationshipService relationshipService,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, EntityKind.EXPERIMENT);
+        super(daoFactory, session, EntityKind.EXPERIMENT, managedPropertyEvaluatorFactory);
         this.relationshipService = relationshipService;
     }
 
     ExperimentBO(final IDAOFactory daoFactory, final Session session,
-            final IEntityPropertiesConverter entityPropertiesConverter)
+            final IEntityPropertiesConverter entityPropertiesConverter,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, entityPropertiesConverter);
+        super(daoFactory, session, entityPropertiesConverter, managedPropertyEvaluatorFactory);
     }
 
     @SuppressWarnings("unused")
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
index 15d9937e7170ed9162dbc4bc27c843e8a629cbc5..1c6d06ea0d4faa534d2d753745516981545dff8b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
@@ -52,6 +52,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * The only productive implementation of {@link IExperimentTable}.
@@ -69,15 +70,17 @@ public final class ExperimentTable extends AbstractBusinessObject implements IEx
     private IRelationshipService relationshipService;
 
     ExperimentTable(final IDAOFactory daoFactory, final Session session,
-            IEntityPropertiesConverter converter)
+            IEntityPropertiesConverter converter,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, converter);
+        super(daoFactory, session, converter, managedPropertyEvaluatorFactory);
     }
 
     public ExperimentTable(final IDAOFactory daoFactory, final Session session,
-            IRelationshipService relationshipService)
+            IRelationshipService relationshipService,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, EntityKind.EXPERIMENT);
+        super(daoFactory, session, EntityKind.EXPERIMENT, managedPropertyEvaluatorFactory);
         this.relationshipService = relationshipService;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java
index 57e6a93ac04c663bdf79c7e81e171e6d4407ce75..8d77fe65f28ad9fc2459b37898c3024e9f265cb2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IExpressionUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewColumnOrFilter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.GridCustomColumnPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * Operations on grid custom columns.
@@ -43,9 +44,10 @@ public class GridCustomColumnBO extends AbstractBusinessObject implements
 
     private GridCustomColumnPE column;
 
-    public GridCustomColumnBO(IDAOFactory daoFactory, Session session)
+    public GridCustomColumnBO(IDAOFactory daoFactory, Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomFilterBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomFilterBO.java
index a14dee35612264ed42632d1091f0453ab51b9b44..3258f7ec6d62bdc954e1916f095c00d2e15c8a85 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomFilterBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomFilterBO.java
@@ -26,6 +26,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IExpressionUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewColumnOrFilter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.GridCustomFilterPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * Operations on grid custom filters.
@@ -37,9 +38,10 @@ public class GridCustomFilterBO extends AbstractBusinessObject implements
 {
     private GridCustomFilterPE filter;
 
-    public GridCustomFilterBO(IDAOFactory daoFactory, Session session)
+    public GridCustomFilterBO(IDAOFactory daoFactory, Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java
index 72ebf0509b31d19ddd416478d983feb31e8bbb68..06d5eb2e47109671caca1323c56630307a2c1144 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java
@@ -41,6 +41,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -54,9 +55,10 @@ public final class MaterialBO extends AbstractMaterialBusinessObject implements
 
     private boolean dataChanged;
 
-    public MaterialBO(final IDAOFactory daoFactory, final Session session)
+    public MaterialBO(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialTable.java
index ca95b4098f8ee22bc04ae5177fe68940576fc7b4..ec84ea34ffddd6a2205b1b11574e6a58e2902b3b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialTable.java
@@ -42,6 +42,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * The only productive implementation of {@link IMaterialTable}.
@@ -54,18 +55,19 @@ public final class MaterialTable extends AbstractMaterialBusinessObject implemen
 
     private boolean dataChanged;
 
-    public MaterialTable(final IDAOFactory daoFactory, final Session session)
+    public MaterialTable(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     @Private
     // for tests only
     MaterialTable(final IDAOFactory daoFactory, final Session session,
             final IEntityPropertiesConverter entityPropertiesConverter, List<MaterialPE> materials,
-            boolean dataChanged)
+            boolean dataChanged, IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, entityPropertiesConverter);
+        super(daoFactory, session, entityPropertiesConverter, managedPropertyEvaluatorFactory);
         this.materials = materials;
         this.dataChanged = dataChanged;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java
index 9cfbde1c9b1e9750dbcdd9b26bdff42d545f4faa..c168d3d944b04bec99957d55d07beb6ed2da3597 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java
@@ -54,6 +54,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * @author Pawel Glyzewski
@@ -79,9 +80,10 @@ public class MetaprojectBO extends AbstractBusinessObject implements IMetaprojec
     private boolean dataChanged;
 
     public MetaprojectBO(final IDAOFactory daoFactory, IExperimentBO experimentBO,
-            ISampleBO sampleBO, IDataBO dataBO, IMaterialBO materialBO, final Session session)
+            ISampleBO sampleBO, IDataBO dataBO, IMaterialBO materialBO, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
 
         this.experimentBO = experimentBO;
         this.sampleBO = sampleBO;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java
index 87cf69a8cd22bc6ba8a83db78f39d513d9116fb1..c8b8f8bb701af92f8ff092608c2cb26d6f68a41a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java
@@ -46,6 +46,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -72,9 +73,10 @@ public final class ProjectBO extends AbstractBusinessObject implements IProjectB
     private IRelationshipService relationshipService;
 
     public ProjectBO(final IDAOFactory daoFactory, final Session session,
-            IRelationshipService relationshipService)
+            IRelationshipService relationshipService,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
         this.relationshipService = relationshipService;
     }
 
@@ -128,8 +130,7 @@ public final class ProjectBO extends AbstractBusinessObject implements IProjectB
 
     @Override
     public void define(ProjectIdentifier projectIdentifier, String description,
-            List<NewAttachment> attachmentsOrNull, String creatorId)
-            throws UserFailureException
+            List<NewAttachment> attachmentsOrNull, String creatorId) throws UserFailureException
     {
         assert projectIdentifier != null : "Unspecified project identifier.";
         this.project = createProject(projectIdentifier, description, attachmentsOrNull, creatorId);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java
index 2637614715667ae8491b13bee418bba75a343f3c..ad588a256abc0162a6ca1ebebbb18e89379e870e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java
@@ -48,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.XmlUtils;
 
 /**
@@ -59,9 +60,10 @@ public final class PropertyTypeBO extends VocabularyBO implements IPropertyTypeB
 {
     private PropertyTypePE propertyTypePE;
 
-    public PropertyTypeBO(final IDAOFactory daoFactory, final Session session)
+    public PropertyTypeBO(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeTable.java
index 702e93a897446fda995096b02648470aee92fd1d..012d778471684c6d6413a46b8c50c1c243f5a198 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeTable.java
@@ -21,6 +21,7 @@ import java.util.List;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -32,9 +33,10 @@ public final class PropertyTypeTable extends AbstractBusinessObject implements I
 {
     private List<PropertyTypePE> propertyTypes;
 
-    public PropertyTypeTable(final IDAOFactory daoFactory, final Session session)
+    public PropertyTypeTable(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTable.java
index 084185940441892344d3b13676fa52bd2befef8e..8103b91c7ccd74ffbbe1486adb7b17c80d3362dc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTable.java
@@ -29,13 +29,14 @@ import ch.systemsx.cisd.openbis.generic.server.util.SpaceIdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AuthorizationGroupPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewRoleAssignment;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * The only productive implementation of {@link IRoleAssignmentTable}. We are using an interface
@@ -52,9 +53,10 @@ public final class RoleAssignmentTable extends AbstractBusinessObject implements
 
     private TableMap<String, AuthorizationGroupPE> authorizationGroupsByCode;
 
-    public RoleAssignmentTable(final IDAOFactory daoFactory, final Session session)
+    public RoleAssignmentTable(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     private final PersonPE getPerson(final String userId)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
index 7a7e35e96834042dde1b6398033cf0bc6903c8e5..dd86c7683f29969e5c04de6d1ef20e85efe30ee6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
@@ -48,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -67,18 +68,21 @@ public final class SampleBO extends AbstractSampleBusinessObject implements ISam
 
     public SampleBO(final IDAOFactory daoFactory, final Session session,
             final IRelationshipService relationshipService,
-            final IEntityOperationChecker entityOperationChecker)
+            final IEntityOperationChecker entityOperationChecker,
+            final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, relationshipService, entityOperationChecker);
+        super(daoFactory, session, relationshipService, entityOperationChecker,
+                managedPropertyEvaluatorFactory);
     }
 
     SampleBO(final IDAOFactory daoFactory, final Session session,
             final IEntityPropertiesConverter entityPropertiesConverter,
             IRelationshipService relationshipService,
-            final IEntityOperationChecker entityOperationChecker)
+            final IEntityOperationChecker entityOperationChecker,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         super(daoFactory, session, entityPropertiesConverter, relationshipService,
-                entityOperationChecker);
+                entityOperationChecker, managedPropertyEvaluatorFactory);
     }
 
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
index 12e1e20afb42f238b5da9ad2edf9350d2b0030b6..01aaa2c7ad8beb9547d77a2ee5d031c0cea3a357 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
@@ -57,6 +57,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleOwnerIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * The unique {@link ISampleBO} implementation.
@@ -74,9 +75,12 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I
     private boolean businessRulesChecked;
 
     public SampleTable(final IDAOFactory daoFactory, final Session session,
-            IRelationshipService relationshipService, IEntityOperationChecker entityOperationChecker)
+            IRelationshipService relationshipService,
+            IEntityOperationChecker entityOperationChecker,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session, relationshipService, entityOperationChecker);
+        super(daoFactory, session, relationshipService, entityOperationChecker,
+                managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -455,8 +459,7 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I
                     samplesByIdentifiers.get(sampleUpdates.getOldSampleIdentifierOrNull());
             final List<AttachmentPE> attachments = new ArrayList<AttachmentPE>();
             prepareBatchUpdate(sample, attachments, sampleUpdates, sampleOwnerCache,
-                    experimentCache,
-                    propertiesCache);
+                    experimentCache, propertiesCache);
             attachmentListsOrNull.add(attachments);
         }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBO.java
index 4ae6ed65b5ea9bccda2c1aa5beed0c3689c2acc4..aa3441f3d8d9c5b2d0e2ad0d38df38504a44d7e5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBO.java
@@ -27,11 +27,13 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calcu
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.JythonEntityValidationCalculator;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IScriptUpdates;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.JythonManagedPropertyEvaluator;
 
 /**
@@ -47,16 +49,18 @@ public final class ScriptBO extends AbstractBusinessObject implements IScriptBO
 
     private final IScriptFactory scriptFactory;
 
-    public ScriptBO(final IDAOFactory daoFactory, final Session session)
+    public ScriptBO(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        this(daoFactory, session, new ScriptFactory());
+        this(daoFactory, session, new ScriptFactory(), managedPropertyEvaluatorFactory);
     }
 
     @Private
     // for testing
-    ScriptBO(final IDAOFactory daoFactory, final Session session, IScriptFactory scriptFactory)
+    ScriptBO(final IDAOFactory daoFactory, final Session session, IScriptFactory scriptFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
         this.scriptFactory = scriptFactory;
     }
 
@@ -106,7 +110,8 @@ public final class ScriptBO extends AbstractBusinessObject implements IScriptBO
         assert script != null : "Script not defined";
         try
         {
-            checkScriptCompilation(script.getScriptType(), script.getScript());
+            checkScriptCompilation(script.getScriptType(), script.getPluginType(),
+                    script.getScript());
             getScriptDAO().createOrUpdate(script);
         } catch (final DataAccessException e)
         {
@@ -125,6 +130,7 @@ public final class ScriptBO extends AbstractBusinessObject implements IScriptBO
         script.setRegistrator(findPerson());
         script.setScript(newScript.getScript());
         script.setScriptType(newScript.getScriptType());
+        script.setPluginType(newScript.getPluginType());
         script.setEntityKind(newScript.getEntityKind());
     }
 
@@ -135,11 +141,13 @@ public final class ScriptBO extends AbstractBusinessObject implements IScriptBO
         script.setName(updates.getName());
         script.setDescription(updates.getDescription());
         boolean scriptChanged = false;
-        if (script.getScript().equals(updates.getScript()) == false)
+        if (script.getScript() != updates.getScript()
+                && script.getScript().equals(updates.getScript()) == false)
         {
             scriptChanged = true;
             script.setScript(updates.getScript());
-            checkScriptCompilation(script.getScriptType(), updates.getScript());
+            checkScriptCompilation(script.getScriptType(), script.getPluginType(),
+                    updates.getScript());
         }
         getScriptDAO().createOrUpdate(script);
 
@@ -154,9 +162,14 @@ public final class ScriptBO extends AbstractBusinessObject implements IScriptBO
         }
     }
 
-    private void checkScriptCompilation(ScriptType scriptType, String scriptExpression)
-            throws EvaluatorException
+    private void checkScriptCompilation(ScriptType scriptType, PluginType pluginType,
+            String scriptExpression) throws EvaluatorException
     {
+        if (pluginType == PluginType.PREDEPLOYED)
+        {
+            return;
+        }
+
         if (scriptType == ScriptType.MANAGED_PROPERTY)
         {
             new JythonManagedPropertyEvaluator(scriptExpression);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SpaceBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SpaceBO.java
index 0f25467840c249f43989d633d6dd87c2473b2d11..10f6189a51ac11ca1d431327475cbc25b9dfbcc4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SpaceBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SpaceBO.java
@@ -36,6 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * The only productive implementation of {@link ISpaceBO}. We are using an interface here to keep
@@ -48,9 +49,10 @@ public final class SpaceBO extends AbstractBusinessObject implements ISpaceBO
 
     private SpacePE space;
 
-    public SpaceBO(final IDAOFactory daoFactory, final Session session)
+    public SpaceBO(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
index f62f4b508464b894c63a8a5841ba42bdb9347015..c98c76082304cf018818fed04a1d572b11794443 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
@@ -39,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * @author Piotr Buczek
@@ -54,9 +55,10 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
 
     private DeletionPE deletion;
 
-    public TrashBO(IDAOFactory daoFactory, ICommonBusinessObjectFactory boFactory, Session session)
+    public TrashBO(IDAOFactory daoFactory, ICommonBusinessObjectFactory boFactory, Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
         this.boFactory = boFactory;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java
index f8c4ace72841d10b4f8d65c6319a2d20b9c2528c..a6b4ed35202c4fa5b29d9ea75c19d8afbf331a7c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java
@@ -58,6 +58,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyTermPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyTermWithStats;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -77,16 +78,18 @@ public class VocabularyBO extends AbstractBusinessObject implements IVocabularyB
 
     private VocabularyPE vocabularyPE;
 
-    public VocabularyBO(final IDAOFactory daoFactory, final Session session)
+    public VocabularyBO(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     // For tests only
     @Private
-    VocabularyBO(final IDAOFactory daoFactory, final Session session, VocabularyPE vocabulary)
+    VocabularyBO(final IDAOFactory daoFactory, final Session session, VocabularyPE vocabulary,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
         vocabularyPE = vocabulary;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyTermBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyTermBO.java
index 71cf4e2fee6d2e6983facaf96ac1c82312ab2c5c..42e9632a3b6b4310f691884a8d2fc83946547c98 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyTermBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyTermBO.java
@@ -27,6 +27,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyTermUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyTermPE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * The only productive implementation of {@link IVocabularyTermBO}.
@@ -37,9 +38,10 @@ public final class VocabularyTermBO extends AbstractBusinessObject implements IV
 {
     private VocabularyTermPE vocabularyTermPE;
 
-    public VocabularyTermBO(final IDAOFactory daoFactory, final Session session)
+    public VocabularyTermBO(final IDAOFactory daoFactory, final Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        super(daoFactory, session);
+        super(daoFactory, session, managedPropertyEvaluatorFactory);
     }
 
     //
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 d1ba3b17f4aae17701e168ecf974d44f6df01c11..b3e13cbaf88ca3a5604dabcc5b19eae5f3aebdc9 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
@@ -58,7 +58,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyTermPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluator;
-import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.PersonTranslator;
 
 /**
@@ -111,15 +111,20 @@ public final class EntityPropertiesConverter implements IEntityPropertiesConvert
 
     private final IPropertyPlaceholderCreator placeholderCreator;
 
-    public EntityPropertiesConverter(final EntityKind entityKind, final IDAOFactory daoFactory)
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
+    public EntityPropertiesConverter(final EntityKind entityKind, final IDAOFactory daoFactory,
+            final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        this(entityKind, daoFactory, new PropertyValidator(), new PlaceholderPropertyCreator());
+        this(entityKind, daoFactory, new PropertyValidator(), new PlaceholderPropertyCreator(),
+                managedPropertyEvaluatorFactory);
     }
 
     @Private
     EntityPropertiesConverter(final EntityKind entityKind, final IDAOFactory daoFactory,
             final IPropertyValueValidator propertyValueValidator,
-            IPropertyPlaceholderCreator placeholderCreator)
+            IPropertyPlaceholderCreator placeholderCreator,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         assert entityKind != null : "Unspecified entity kind.";
         assert daoFactory != null : "Unspecified DAO factory.";
@@ -130,6 +135,7 @@ public final class EntityPropertiesConverter implements IEntityPropertiesConvert
         this.propertyValueValidator = propertyValueValidator;
         this.placeholderCreator = placeholderCreator;
         this.complexPropertyValueHelper = new ComplexPropertyValueHelper(daoFactory, null);
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     private final Set<String> getDynamicProperties(final EntityTypePE entityTypePE)
@@ -247,7 +253,8 @@ public final class EntityPropertiesConverter implements IEntityPropertiesConvert
                 new ArrayList<ExtendedEntityTypePropertyType>();
         for (EntityTypePropertyTypePE entityTypePropertyTypePE : entityPropertyTypes)
         {
-            result.add(new ExtendedEntityTypePropertyType(entityTypePropertyTypePE));
+            result.add(new ExtendedEntityTypePropertyType(entityTypePropertyTypePE,
+                    managedPropertyEvaluatorFactory));
         }
         return result;
     }
@@ -561,13 +568,14 @@ public final class EntityPropertiesConverter implements IEntityPropertiesConvert
 
         private IManagedPropertyEvaluator evaluator;
 
-        ExtendedEntityTypePropertyType(EntityTypePropertyTypePE entityTypePropertyTypePE)
+        ExtendedEntityTypePropertyType(EntityTypePropertyTypePE entityTypePropertyTypePE,
+                IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
         {
             this.entityTypePropertyTypePE = entityTypePropertyTypePE;
             if (entityTypePropertyTypePE.isManaged())
             {
                 evaluator =
-                        ManagedPropertyEvaluatorFactory
+                        managedPropertyEvaluatorFactory
                                 .createManagedPropertyEvaluator(entityTypePropertyTypePE);
                 inputWidgetDescriptions = evaluator.getInputWidgetDescriptions();
             } else
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityValidationInterceptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityValidationInterceptor.java
index 7817495c91411006fc843e39273634e361db57be..a8483c4b7f0f2c330271d2cb161a3b605a71a7bb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityValidationInterceptor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityValidationInterceptor.java
@@ -44,16 +44,18 @@ import ch.systemsx.cisd.openbis.common.conversation.context.ServiceConversations
 import ch.systemsx.cisd.openbis.common.conversation.progress.IServiceConversationProgressListener;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.DynamicPropertyEvaluator;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.IDynamicPropertyCalculatorFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.IDynamicPropertyEvaluator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.EntityAdaptorFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.INonAbstractEntityAdapter;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.JythonEntityValidationCalculator.IValidationRequestDelegate;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityAdaptor;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.EntityValidatorFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.IEntityValidatorFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.api.IEntityValidator;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * {@link Interceptor} which reacts to creation and update of entities, and calls the validation
@@ -73,11 +75,22 @@ public class EntityValidationInterceptor extends EmptyInterceptor implements
 
     private IDAOFactory daoFactory;
 
+    private final IEntityValidatorFactory entityValidationFactory;
+
+    private final IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory;
+
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     public EntityValidationInterceptor(IHibernateTransactionManagerCallback callback,
-            IDAOFactory daoFactory)
+            IDAOFactory daoFactory, IEntityValidatorFactory entityValidationFactory,
+            IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.callback = callback;
         this.daoFactory = daoFactory;
+        this.entityValidationFactory = entityValidationFactory;
+        this.dynamicPropertyCalculatorFactory = dynamicPropertyCalculatorFactory;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
         initializeLists();
 
         totalEntitiesToValidateCount = 0;
@@ -156,10 +169,11 @@ public class EntityValidationInterceptor extends EmptyInterceptor implements
 
     private boolean isCached(Session session, EntityIdentifier identifier)
     {
-        return ((SessionImpl) session).getEntityUsingInterceptor(new EntityKey(identifier
-                .getId(), ((SessionFactoryImplementor) daoFactory.getSessionFactory())
-                .getEntityPersister(identifier.getEntityClass().getName()),
-                EntityMode.POJO)) != null;
+        return ((SessionImpl) session)
+                .getEntityUsingInterceptor(new EntityKey(identifier.getId(),
+                        ((SessionFactoryImplementor) daoFactory.getSessionFactory())
+                                .getEntityPersister(identifier.getEntityClass().getName()),
+                        EntityMode.POJO)) != null;
     }
 
     private Collection<EntityIdentifier> cachedEntities(Session session)
@@ -183,8 +197,10 @@ public class EntityValidationInterceptor extends EmptyInterceptor implements
 
         for (EntityIdentifier identifier : cachedEntities(session))
         {
-            validateEntity(tx, (IEntityInformationWithPropertiesHolder) session.get(
-                    identifier.getEntityClass(), identifier.getId()));
+            validateEntity(
+                    tx,
+                    (IEntityInformationWithPropertiesHolder) session.get(
+                            identifier.getEntityClass(), identifier.getId()));
             if (isRolledBack)
             {
                 return;
@@ -230,8 +246,7 @@ public class EntityValidationInterceptor extends EmptyInterceptor implements
                 @Override
                 public int compare(EntityIdentifier arg0, EntityIdentifier arg1)
                 {
-                    return arg0.getKind().toString().compareTo(
-                            arg1.getKind().toString());
+                    return arg0.getKind().toString().compareTo(arg1.getKind().toString());
                 }
             });
 
@@ -259,8 +274,7 @@ public class EntityValidationInterceptor extends EmptyInterceptor implements
                                 }
                                 List<EntityIdentifier> list = new ArrayList<EntityIdentifier>();
                                 EntityKind kind = ids.get(index).getKind();
-                                while (list.size() < batchSize
-                                        && index < ids.size()
+                                while (list.size() < batchSize && index < ids.size()
                                         && ids.get(index).getKind().equals(kind))
                                 {
                                     list.add(ids.get(index));
@@ -284,7 +298,7 @@ public class EntityValidationInterceptor extends EmptyInterceptor implements
         boolean isNewEntity = newEntities.contains(new EntityIdentifier(entity));
 
         IEntityValidator entityValidator =
-                EntityValidatorFactory.createEntityValidator(entity.getEntityType(), this);
+                entityValidationFactory.createEntityValidator(entity.getEntityType(), this);
         if (entityValidator != null)
         {
             try
@@ -336,7 +350,9 @@ public class EntityValidationInterceptor extends EmptyInterceptor implements
     private String calculate(IEntityValidator entityValidator,
             IEntityInformationWithPropertiesHolder entity, boolean isNewEntity)
     {
-        IDynamicPropertyEvaluator evaluator = new DynamicPropertyEvaluator(daoFactory, null);
+        IDynamicPropertyEvaluator evaluator =
+                new DynamicPropertyEvaluator(daoFactory, null, dynamicPropertyCalculatorFactory,
+                        managedPropertyEvaluatorFactory);
         IEntityAdaptor adaptor =
                 EntityAdaptorFactory.create(entity, evaluator, daoFactory.getSessionFactory()
                         .getCurrentSession());
@@ -364,8 +380,7 @@ public class EntityValidationInterceptor extends EmptyInterceptor implements
         if (false == validatedEntities.add(new EntityIdentifier(entity)))
         {
             throw new IllegalStateException(
-                    "Programming error - trying to validate the same entity twice ("
-                            + entity + ")");
+                    "Programming error - trying to validate the same entity twice (" + entity + ")");
         }
 
         if (false == entitiesToValidate.remove(new EntityIdentifier(entity)))
@@ -447,8 +462,7 @@ public class EntityValidationInterceptor extends EmptyInterceptor implements
             if (o instanceof EntityIdentifier)
             {
                 EntityIdentifier e = (EntityIdentifier) o;
-                return (e.code.equals(code))
-                        && e.kind.equals(kind);
+                return (e.code.equals(code)) && e.kind.equals(kind);
             } else
             {
                 throw new IllegalArgumentException(o.toString());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/OpenBISHibernateTransactionManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/OpenBISHibernateTransactionManager.java
index a5cb10f5014d1cd1f5c4e72b239a5a0396431d94..5939d307817508fda429921bffb62172c4e3598e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/OpenBISHibernateTransactionManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/OpenBISHibernateTransactionManager.java
@@ -33,7 +33,10 @@ import org.springframework.transaction.support.DefaultTransactionStatus;
 
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.HibernateInterceptorsWrapper;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.IDynamicPropertyCalculatorFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.IEntityValidatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * An implementation of {@link HibernateTransactionManager} that:
@@ -55,9 +58,21 @@ public class OpenBISHibernateTransactionManager extends HibernateTransactionMana
 
     private DynamicPropertiesInterceptor dynamicPropertiesInterceptor;
 
-    public OpenBISHibernateTransactionManager(IDAOFactory daoFactory)
+    private IEntityValidatorFactory entityValidationFactory;
+
+    private IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory;
+
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
+    public OpenBISHibernateTransactionManager(IDAOFactory daoFactory,
+            IEntityValidatorFactory entityValidationFactory,
+            IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.daoFactory = daoFactory;
+        this.entityValidationFactory = entityValidationFactory;
+        this.dynamicPropertyCalculatorFactory = dynamicPropertyCalculatorFactory;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     public void setDynamicPropertiesInterceptor(
@@ -103,7 +118,8 @@ public class OpenBISHibernateTransactionManager extends HibernateTransactionMana
     public Interceptor getEntityInterceptor() throws IllegalStateException, BeansException
     {
         EntityValidationInterceptor entityValidationInterceptor =
-                new EntityValidationInterceptor(this, daoFactory);
+                new EntityValidationInterceptor(this, daoFactory, entityValidationFactory,
+                        dynamicPropertyCalculatorFactory, managedPropertyEvaluatorFactory);
 
         return new HibernateInterceptorsWrapper(dynamicPropertiesInterceptor,
                 entityValidationInterceptor);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DefaultBatchDynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DefaultBatchDynamicPropertyEvaluator.java
index b415001a1df42a6fe4da3e27c248a7240e0b4860..c9ac7c4bcb6425033d2c4932ee71fcab87e39e92 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DefaultBatchDynamicPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DefaultBatchDynamicPropertyEvaluator.java
@@ -43,6 +43,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropert
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * A default {@link IBatchDynamicPropertyEvaluator}.
@@ -72,11 +73,19 @@ final class DefaultBatchDynamicPropertyEvaluator implements IBatchDynamicPropert
 
     private final IDAOFactory daoFactory;
 
-    DefaultBatchDynamicPropertyEvaluator(final int batchSize, IDAOFactory daoFactory)
+    private final IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory;
+
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
+    DefaultBatchDynamicPropertyEvaluator(final int batchSize, IDAOFactory daoFactory,
+            IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         assert batchSize > -1 : "Batch size can not be negative.";
         this.batchSize = batchSize;
         this.daoFactory = daoFactory;
+        this.dynamicPropertyCalculatorFactory = dynamicPropertyCalculatorFactory;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     private DynamicPropertyEvaluator createEvaluator(final Session hibernateSession)
@@ -88,7 +97,7 @@ final class DefaultBatchDynamicPropertyEvaluator implements IBatchDynamicPropert
                 {
                     return hibernateSession;
                 }
-            });
+            }, dynamicPropertyCalculatorFactory, managedPropertyEvaluatorFactory);
     }
 
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluationRunnable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluationRunnable.java
index 23e9c88354b44c18d300555bae3f878924a3b235..2d6b8d9ba2a8aab9cb1ebf633dbc95030506e950 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluationRunnable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluationRunnable.java
@@ -33,6 +33,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDynamicPropertyEvalua
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IndexUpdateOperation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * @author Piotr Buczek
@@ -58,12 +59,16 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport
     public DynamicPropertyEvaluationRunnable(final SessionFactory sessionFactory,
             final IDAOFactory daoFactory,
             final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler,
-            final IDynamicPropertyEvaluationSchedulerWithQueue evaluationQueue)
+            final IDynamicPropertyEvaluationSchedulerWithQueue evaluationQueue,
+            final IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory,
+            final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.fullTextIndexUpdateScheduler = fullTextIndexUpdateScheduler;
         this.evaluationQueue = evaluationQueue;
         setSessionFactory(sessionFactory);
-        evaluator = new DefaultBatchDynamicPropertyEvaluator(BATCH_SIZE, daoFactory);
+        evaluator =
+                new DefaultBatchDynamicPropertyEvaluator(BATCH_SIZE, daoFactory,
+                        dynamicPropertyCalculatorFactory, managedPropertyEvaluatorFactory);
     }
 
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluator.java
index 29a73d2670fd0f28c332871e37ff5fb64510230f..2379c0daa6985c200dc5ae27b35a82232ea90cd5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluator.java
@@ -33,7 +33,6 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.EntityPropertiesConver
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.EntityPropertiesConverter.IHibernateSessionProvider;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IEntityPropertiesConverter;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.DynamicPropertyCalculatorFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.EntityAdaptorFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.IDynamicPropertyCalculator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityAdaptor;
@@ -45,6 +44,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyTermPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * Default implementation of {@link IDynamicPropertyEvaluator}. For efficient evaluation of
@@ -59,8 +59,9 @@ public class DynamicPropertyEvaluator implements IDynamicPropertyEvaluator
 
     public static final String ERROR_PREFIX = "ERROR: ";
 
-    private final IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory =
-            new DynamicPropertyCalculatorFactory();
+    private final IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory;
+
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
 
     /** path of evaluation - used to generate meaningful error message for cyclic dependencies */
     private final List<EntityTypePropertyTypePE> evaluationPath =
@@ -69,12 +70,16 @@ public class DynamicPropertyEvaluator implements IDynamicPropertyEvaluator
     private EntityPropertiesConverterDelegatorFacade entityPropertiesConverter;
 
     public DynamicPropertyEvaluator(IDAOFactory daoFactory,
-            IHibernateSessionProvider customSessionProviderOrNull)
+            IHibernateSessionProvider customSessionProviderOrNull,
+            IDynamicPropertyCalculatorFactory dynamicPropertyCalculatorFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         assert daoFactory != null;
         this.entityPropertiesConverter =
                 new EntityPropertiesConverterDelegatorFacade(daoFactory,
-                        customSessionProviderOrNull);
+                        customSessionProviderOrNull, managedPropertyEvaluatorFactory);
+        this.dynamicPropertyCalculatorFactory = dynamicPropertyCalculatorFactory;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     @Override
@@ -195,7 +200,8 @@ public class DynamicPropertyEvaluator implements IDynamicPropertyEvaluator
         private final ComplexPropertyValueHelper complexPropertyValueHelper;
 
         public EntityPropertiesConverterDelegatorFacade(IDAOFactory daoFactory,
-                IHibernateSessionProvider customSessionProviderOrNull)
+                IHibernateSessionProvider customSessionProviderOrNull,
+                IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
         {
             this.complexPropertyValueHelper =
                     new EntityPropertiesConverter.ComplexPropertyValueHelper(daoFactory,
@@ -203,7 +209,7 @@ public class DynamicPropertyEvaluator implements IDynamicPropertyEvaluator
             for (EntityKind entityKind : EntityKind.values())
             {
                 convertersByEntityKind.put(entityKind, new EntityPropertiesConverter(entityKind,
-                        daoFactory));
+                        daoFactory, managedPropertyEvaluatorFactory));
             }
         }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/IDynamicPropertyCalculatorFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/IDynamicPropertyCalculatorFactory.java
index da8697f94d99d3e8b6fb369bcb11b47d3c90d259..4bf642debcacd78768487b8ae86651367a774655 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/IDynamicPropertyCalculatorFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/IDynamicPropertyCalculatorFactory.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property;
 
+import java.util.List;
+
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.IDynamicPropertyCalculator;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 
@@ -25,4 +27,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 public interface IDynamicPropertyCalculatorFactory
 {
     public IDynamicPropertyCalculator getCalculator(EntityTypePropertyTypePE etpt);
+
+    public List<String> listPredeployedPlugins();
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java
index 3003430cc7fa55ba6e8aecef6ec82440b43b1322..6e09defbcba4f70c43dc1319d6e8d148f3f2206d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java
@@ -97,36 +97,42 @@ public class AbstractEntityAdaptor implements IEntityAdaptor
 
         for (EntityPropertyPE property : propertiesHolder.getProperties())
         {
-            EntityTypePropertyTypePE etpt = property.getEntityTypePropertyType();
-            final PropertyTypePE propertyType = etpt.getPropertyType();
-            final String propertyTypeCode = propertyType.getCode();
-            if (etpt.isDynamic())
+            addProperty(adaptEntityProperty(property, this, evaluator));
+        }
+    }
+
+    public static IEntityPropertyAdaptor adaptEntityProperty(EntityPropertyPE property,
+            IEntityAdaptor entityAdaptor, IDynamicPropertyEvaluator evaluator)
+    {
+        EntityTypePropertyTypePE etpt = property.getEntityTypePropertyType();
+        final PropertyTypePE propertyType = etpt.getPropertyType();
+        final String propertyTypeCode = propertyType.getCode();
+        if (etpt.isDynamic())
+        {
+            return new DynamicPropertyAdaptor(propertyTypeCode, entityAdaptor, property, evaluator);
+        } else
+        {
+            final String value;
+            if (property.getMaterialValue() != null)
+            {
+                final MaterialPE material = property.getMaterialValue();
+                value =
+                        MaterialIdentifier.print(material.getCode(), material.getEntityType()
+                                .getCode());
+            } else if (property.getVocabularyTerm() != null)
+            {
+                value = property.getVocabularyTerm().getCode();
+            } else
+            {
+                value = property.getValue();
+            }
+            if (propertyType.getTransformation() == null)
             {
-                addProperty(new DynamicPropertyAdaptor(propertyTypeCode, this, property, evaluator));
+                return new BasicPropertyAdaptor(propertyTypeCode, value, property);
             } else
             {
-                final String value;
-                if (property.getMaterialValue() != null)
-                {
-                    final MaterialPE material = property.getMaterialValue();
-                    value =
-                            MaterialIdentifier.print(material.getCode(), material.getEntityType()
-                                    .getCode());
-                } else if (property.getVocabularyTerm() != null)
-                {
-                    value = property.getVocabularyTerm().getCode();
-                } else
-                {
-                    value = property.getValue();
-                }
-                if (propertyType.getTransformation() == null)
-                {
-                    addProperty(new BasicPropertyAdaptor(propertyTypeCode, value, property));
-                } else
-                {
-                    addProperty(new XmlPropertyAdaptor(propertyTypeCode, value, property,
-                            propertyType.getTransformation()));
-                }
+                return new XmlPropertyAdaptor(propertyTypeCode, value, property,
+                        propertyType.getTransformation());
             }
         }
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/DynamicPropertyCalculatorFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/DynamicPropertyCalculatorFactory.java
index 46460c7f90ca30a2dc3155485b772b4cb919d668..67ddea02c235f53eba49841a44298fc6ab7964f6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/DynamicPropertyCalculatorFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/DynamicPropertyCalculatorFactory.java
@@ -16,18 +16,77 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import ch.ethz.cisd.hotdeploy.PluginMapHolder;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.common.shared.basic.string.StringUtils;
+import ch.systemsx.cisd.openbis.generic.server.IHotDeploymentController;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.IDynamicPropertyCalculatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 
 /**
+ * The class is responsible for getting a dynamic property calculator.
+ * 
  * @author Pawel Glyzewski
  */
 public class DynamicPropertyCalculatorFactory implements IDynamicPropertyCalculatorFactory
 {
+    private PluginMapHolder<IDynamicPropertyCalculator> predeployedPlugins;
+
+    public DynamicPropertyCalculatorFactory(IHotDeploymentController hotDeploymentController,
+            String pluginDirectoryPath)
+    {
+        if (false == StringUtils.isBlank(pluginDirectoryPath))
+        {
+            hotDeploymentController.addPluginDirectory(new File(pluginDirectoryPath));
+            this.predeployedPlugins =
+                    hotDeploymentController.getPluginMap(IDynamicPropertyCalculator.class);
+        } else
+        {
+            this.predeployedPlugins = null;
+        }
+    }
+
     @Override
     /** Returns a calculator for given script (creates a new one if nothing is found in cache). */
     public IDynamicPropertyCalculator getCalculator(EntityTypePropertyTypePE etpt)
     {
-        return JythonDynamicPropertyCalculator.create(etpt.getScript().getScript());
+        switch (etpt.getScript().getPluginType())
+        {
+            case JYTHON:
+                return JythonDynamicPropertyCalculator.create(etpt.getScript().getScript());
+            case PREDEPLOYED:
+                if (predeployedPlugins == null)
+                {
+                    throw new UserFailureException(
+                            "Predeployed dynamic property calculator plugins are not configured properly.");
+                }
+                IDynamicPropertyCalculator dynamicPropertyCalculator =
+                        predeployedPlugins.tryGet(etpt.getScript().getName());
+                if (dynamicPropertyCalculator == null)
+                {
+                    throw new UserFailureException("Couldn't find plugin named '"
+                            + etpt.getScript().getName() + "'.");
+                }
+
+                return dynamicPropertyCalculator;
+        }
+
+        return null;
+    }
+
+    @Override
+    public List<String> listPredeployedPlugins()
+    {
+        if (predeployedPlugins == null)
+        {
+            return Collections.emptyList();
+        }
+
+        return new ArrayList<String>(predeployedPlugins.getPluginNames());
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/EntityValidatorFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/EntityValidatorFactory.java
index 93066cc3e8701754c75bed4354c106a5e3af3c4a..b7757df6ee293b0e93e198db7fdaa8ab5ac6b6a1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/EntityValidatorFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/EntityValidatorFactory.java
@@ -16,29 +16,95 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import ch.ethz.cisd.hotdeploy.PluginMapHolder;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.common.shared.basic.string.StringUtils;
+import ch.systemsx.cisd.openbis.generic.server.IHotDeploymentController;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.INonAbstractEntityAdapter;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.JythonEntityValidationCalculator.IValidationRequestDelegate;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.api.IEntityValidator;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
 
 /**
  * @author Pawel Glyzewski
  */
-public class EntityValidatorFactory
+public class EntityValidatorFactory implements IEntityValidatorFactory
 {
-    public static IEntityValidator createEntityValidator(EntityTypePE entityTypePE,
+    private final PluginMapHolder<IEntityValidator> predeployedPlugins;
+
+    public EntityValidatorFactory(IHotDeploymentController hotDeploymentController,
+            String pluginDirectoryPath)
+    {
+        if (false == StringUtils.isBlank(pluginDirectoryPath))
+        {
+            hotDeploymentController.addPluginDirectory(new File(pluginDirectoryPath));
+            this.predeployedPlugins = hotDeploymentController.getPluginMap(IEntityValidator.class);
+        } else
+        {
+            this.predeployedPlugins = null;
+        }
+    }
+
+    @Override
+    public IEntityValidator createEntityValidator(EntityTypePE entityTypePE,
             IValidationRequestDelegate<INonAbstractEntityAdapter> validationRequestedDelegate)
     {
         ScriptPE scriptPE = entityTypePE.getValidationScript();
 
         if (scriptPE != null)
         {
-            IEntityValidator validator = new JythonEntityValidator(scriptPE);
+            IEntityValidator validator =
+                    createEntityValidator(scriptPE.getPluginType(), scriptPE.getName(),
+                            scriptPE.getScript());
             validator.init(validationRequestedDelegate);
             return validator;
         }
 
         return null;
     }
+
+    @Override
+    public IEntityValidator createEntityValidator(PluginType pluginType, String scriptName,
+            String script)
+    {
+        switch (pluginType)
+        {
+            case JYTHON:
+                return new JythonEntityValidator(script);
+            case PREDEPLOYED:
+                if (predeployedPlugins == null)
+                {
+                    throw new UserFailureException(
+                            "Predeployed entity validation plugins are not configured properly.");
+                }
+                IEntityValidator entityValidator = predeployedPlugins.tryGet(scriptName);
+                if (entityValidator == null)
+                {
+                    throw new UserFailureException("Couldn't find plugin named '" + scriptName
+                            + "'.");
+                }
+
+                return entityValidator;
+        }
+
+        return null;
+    }
+
+    @Override
+    public List<String> listPredeployedPlugins()
+    {
+        if (predeployedPlugins == null)
+        {
+            return Collections.emptyList();
+        }
+
+        return new ArrayList<String>(predeployedPlugins.getPluginNames());
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/IEntityValidatorFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/IEntityValidatorFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..f02cfc2ead50b565b85c52db88df7b13e0c9a853
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/IEntityValidatorFactory.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.INonAbstractEntityAdapter;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.JythonEntityValidationCalculator.IValidationRequestDelegate;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.api.IEntityValidator;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
+import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
+
+/**
+ * @author Pawel Glyzewski
+ */
+public interface IEntityValidatorFactory
+{
+    public IEntityValidator createEntityValidator(EntityTypePE entityTypePE,
+            IValidationRequestDelegate<INonAbstractEntityAdapter> validationRequestedDelegate);
+
+    public IEntityValidator createEntityValidator(PluginType pluginType, String scriptName,
+            String script);
+
+    public List<String> listPredeployedPlugins();
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/JythonEntityValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/JythonEntityValidator.java
index 3dfd4b6f904ba3a12935ba28113688140e40ec6c..8dc44b078f70d45a3b3f219d8ab13dc9d531a91c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/JythonEntityValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/JythonEntityValidator.java
@@ -19,16 +19,17 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.JythonEntityValidationCalculator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.api.IEntityValidator;
-import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
 
 /**
+ * Jython implementation of entity validators.
+ * 
  * @author Pawel Glyzewski
  */
 public class JythonEntityValidator extends AbstractEntityValidator implements IEntityValidator
 {
-    private final ScriptPE script;
+    private final String script;
 
-    public JythonEntityValidator(ScriptPE script)
+    public JythonEntityValidator(String script)
     {
         this.script = script;
     }
@@ -37,8 +38,7 @@ public class JythonEntityValidator extends AbstractEntityValidator implements IE
     public String validate(IEntityAdaptor entity, boolean isNew)
     {
         JythonEntityValidationCalculator calculator =
-                JythonEntityValidationCalculator.create(script.getScript(),
-                        validationRequestedDelegate);
+                JythonEntityValidationCalculator.create(script, validationRequestedDelegate);
         return calculator.eval(entity, isNew);
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/deployment_examples/.gitignore b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/entity_validation/deployment_examples/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index 7e55bcb392332305265913a4f39cd1dd325e43c5..887a5062a8dbf743e6ef8faa74934a14adefec2c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -1511,4 +1511,9 @@ public interface ICommonServer extends IServer
     public Metaproject updateMetaproject(String sessionToken, IMetaprojectId metaprojectId,
             IMetaprojectUpdates updates);
 
+    /**
+     * Lists all the predeployed plugin names for given script type.
+     */
+    @Transactional(readOnly = true)
+    public List<String> listPredeployedPlugins(String sessionToken, ScriptType scriptType);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DynamicPropertyEvaluationInfo.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DynamicPropertyEvaluationInfo.java
index 2ab8ea28205ccfada0c631ebd0706ad3ee8c1bc0..c236779b5221ee461857bba7152ee9ef04b441c3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DynamicPropertyEvaluationInfo.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DynamicPropertyEvaluationInfo.java
@@ -23,16 +23,21 @@ public class DynamicPropertyEvaluationInfo extends BasicEntityDescription
 {
     private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
+    private String sciptName;
+
     private String script;
 
+    private PluginType pluginType;
+
     public DynamicPropertyEvaluationInfo()
     {
     }
 
     public DynamicPropertyEvaluationInfo(EntityKind entityKind, String entityIdentifier,
-            String script)
+            PluginType pluginType, String scriptName, String script)
     {
         super(entityKind, entityIdentifier);
+        this.sciptName = scriptName;
         this.script = script;
     }
 
@@ -46,4 +51,23 @@ public class DynamicPropertyEvaluationInfo extends BasicEntityDescription
         this.script = script;
     }
 
+    public PluginType getPluginType()
+    {
+        return pluginType;
+    }
+
+    public void setPluginType(PluginType pluginType)
+    {
+        this.pluginType = pluginType;
+    }
+
+    public String getSciptName()
+    {
+        return sciptName;
+    }
+
+    public void setSciptName(String sciptName)
+    {
+        this.sciptName = sciptName;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityValidationEvaluationInfo.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityValidationEvaluationInfo.java
index 1eaa0962b7ce650fa1e3356e580246ac3c260bd0..4a3d14c30a0e465a6e68a74524b754c95e74823e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityValidationEvaluationInfo.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityValidationEvaluationInfo.java
@@ -23,8 +23,12 @@ public class EntityValidationEvaluationInfo extends BasicEntityDescription
 {
     private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
+    private String scriptName;
+
     private String script;
 
+    private PluginType pluginType;
+
     private boolean isNew;
 
     public EntityValidationEvaluationInfo()
@@ -32,10 +36,12 @@ public class EntityValidationEvaluationInfo extends BasicEntityDescription
     }
 
     public EntityValidationEvaluationInfo(EntityKind entityKind, String entityIdentifier,
-            boolean isNew, String script)
+            boolean isNew, PluginType pluginType, String scriptName, String script)
     {
         super(entityKind, entityIdentifier);
         this.script = script;
+        this.scriptName = scriptName;
+        this.pluginType = pluginType;
         this.isNew = isNew;
     }
 
@@ -59,4 +65,23 @@ public class EntityValidationEvaluationInfo extends BasicEntityDescription
         this.isNew = isNew;
     }
 
+    public PluginType getPluginType()
+    {
+        return pluginType;
+    }
+
+    public void setPluginType(PluginType pluginType)
+    {
+        this.pluginType = pluginType;
+    }
+
+    public String getScriptName()
+    {
+        return scriptName;
+    }
+
+    public void setScriptName(String scriptName)
+    {
+        this.scriptName = scriptName;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PluginType.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PluginType.java
new file mode 100644
index 0000000000000000000000000000000000000000..20b0e0c61b16427eb94731b8ea29cc2407ea35f6
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PluginType.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
+
+import java.io.Serializable;
+
+/**
+ * @author Pawel Glyzewski
+ */
+public enum PluginType implements Serializable
+{
+    JYTHON("Jython Script Plugin"), PREDEPLOYED("Predeployed Plugin");
+
+    private final String description;
+
+    private PluginType(final String description)
+    {
+        this.description = description;
+    }
+
+    public final String getDescription()
+    {
+        return description;
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Script.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Script.java
index 25162845da8736fd0af06b290593ef72e2ea41a3..fc6474fd39d053efaf5e3d5ad80d3d9d6d41d0dc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Script.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Script.java
@@ -42,6 +42,8 @@ public class Script extends AbstractRegistrationHolder implements Comparable<Scr
 
     private EntityKind entityKind;
 
+    private PluginType pluginType;
+
     public Script()
     {
     }
@@ -115,6 +117,16 @@ public class Script extends AbstractRegistrationHolder implements Comparable<Scr
         this.scriptType = scriptType;
     }
 
+    public PluginType getPluginType()
+    {
+        return pluginType;
+    }
+
+    public void setPluginType(PluginType pluginType)
+    {
+        this.pluginType = pluginType;
+    }
+
     @Override
     public String toString()
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ColumnNames.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ColumnNames.java
index e26c2ff775b470bb5c7dbac61646235577c177fd..6afd5f58f8631cc978f6a3f084a20d0244bbc036 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ColumnNames.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ColumnNames.java
@@ -310,6 +310,8 @@ public final class ColumnNames
 
     public static final String SCRIPT_TYPE = "script_type";
 
+    public static final String PLUGIN_TYPE = "plugin_type";
+
     public static final String PRESENT_IN_ARCHIVE = "present_in_archive";
 
     public static final String STORAGE_CONFIRMATION = "storage_confirmation";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ScriptPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ScriptPE.java
index 951b17a22b572ef1821b2548551847daf746c409..f23146e4aa3ca5f8cba3c7cf23480f25a4d66f00 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ScriptPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ScriptPE.java
@@ -45,6 +45,7 @@ import ch.systemsx.cisd.common.collection.UnmodifiableListDecorator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder;
 
@@ -65,6 +66,8 @@ public class ScriptPE extends HibernateAbstractRegistrationHolder implements IId
 
     private ScriptType scriptType;
 
+    private PluginType pluginType;
+
     private String name;
 
     private String description;
@@ -144,7 +147,6 @@ public class ScriptPE extends HibernateAbstractRegistrationHolder implements IId
     }
 
     @Column(name = ColumnNames.SCRIPT_COLUMN)
-    @NotNull(message = ValidationMessages.SCRIPT_NOT_NULL_MESSAGE)
     @Length(min = 1, message = ValidationMessages.EXPRESSION_LENGTH_MESSAGE)
     public String getScript()
     {
@@ -297,6 +299,19 @@ public class ScriptPE extends HibernateAbstractRegistrationHolder implements IId
         this.scriptType = scriptType;
     }
 
+    @NotNull(message = ValidationMessages.PLUGIN_TYPE_NOT_NULL_MESSAGE)
+    @Column(name = ColumnNames.PLUGIN_TYPE)
+    @Enumerated(EnumType.STRING)
+    public PluginType getPluginType()
+    {
+        return pluginType;
+    }
+
+    public void setPluginType(PluginType pluginType)
+    {
+        this.pluginType = pluginType;
+    }
+
     @Transient
     public boolean isDynamic()
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ValidationMessages.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ValidationMessages.java
index 04d498fa5e9d732590112f8d5da443989fc52f5c..8d31edc9be63a4b3a289808eeaefdcb049d40c3c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ValidationMessages.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ValidationMessages.java
@@ -235,6 +235,8 @@ public final class ValidationMessages
 
     public static final String SCRIPT_TYPE_NOT_NULL_MESSAGE = "Script Type" + CAN_NOT_BE_NULL;
 
+    public static final String PLUGIN_TYPE_NOT_NULL_MESSAGE = "Plugin Type" + CAN_NOT_BE_NULL;
+
     public static final String REGISTRATION_ID_NOT_NULL_MESSAGE = "Regirtation id"
             + CAN_NOT_BE_NULL;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IManagedPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IManagedPropertyEvaluator.java
index e8cc5562c56cabc0a53757ad819c575f4688f334..e7a916e7b605594178b962a5e3e3d68379fc98fa 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IManagedPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IManagedPropertyEvaluator.java
@@ -19,20 +19,19 @@ package ch.systemsx.cisd.openbis.generic.shared.managed_property;
 import java.util.List;
 import java.util.Map;
 
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityPropertyAdaptor;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedUiAction;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IPerson;
-import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 
 /**
  * @author Jakub Straszewski
  */
 public interface IManagedPropertyEvaluator
 {
-
     public void configureUI(final IManagedProperty managedProperty,
-            final EntityPropertyPE entityPropertyPE);
+            final IEntityPropertyAdaptor entityProperty);
 
     public void updateFromUI(final IManagedProperty managedProperty, final IPerson person,
             final IManagedUiAction action);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IManagedPropertyEvaluatorFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IManagedPropertyEvaluatorFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..768f285a9564f3d8d584953666015c4c71d00c15
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/IManagedPropertyEvaluatorFactory.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.shared.managed_property;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
+import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
+
+/**
+ * @author Pawel Glyzewski
+ */
+public interface IManagedPropertyEvaluatorFactory
+{
+    public IManagedPropertyEvaluator createManagedPropertyEvaluator(
+            EntityTypePropertyTypePE entityTypePropertyTypePE);
+
+    public IManagedPropertyEvaluator createManagedPropertyEvaluator(
+            EntityTypePropertyType<?> entityTypePropertyType);
+
+    public List<String> listPredeployedPlugins();
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/JythonManagedPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/JythonManagedPropertyEvaluator.java
index 95953dd7add1155c50edcbe689d7f4dbbac7d95d..4b1ce9e3c97405014b757a12f964e15c71eee0a1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/JythonManagedPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/JythonManagedPropertyEvaluator.java
@@ -28,12 +28,12 @@ import ch.systemsx.cisd.common.jython.evaluator.Evaluator;
 import ch.systemsx.cisd.common.jython.evaluator.EvaluatorException;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityPropertyAdaptor;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ManagedUiActionDescriptionFactory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedUiAction;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IPerson;
-import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 
 /**
  * Class for evaluating scripts that control managed properties.
@@ -279,7 +279,7 @@ public class JythonManagedPropertyEvaluator implements IManagedPropertyEvaluator
 
     @Override
     public void configureUI(final IManagedProperty managedProperty,
-            final EntityPropertyPE entityPropertyPE)
+            final IEntityPropertyAdaptor entityProperty)
     {
         if (operationLog.isDebugEnabled())
         {
@@ -293,7 +293,7 @@ public class JythonManagedPropertyEvaluator implements IManagedPropertyEvaluator
                 public Void evaluate(Evaluator evaluator)
                 {
                     evaluator.set(PROPERTY_VARIABLE_NAME, managedProperty);
-                    evaluator.set(PROPERTY_PE_VARIABLE_NAME, entityPropertyPE);
+                    evaluator.set(PROPERTY_PE_VARIABLE_NAME, entityProperty);
                     evaluator.evalFunction(CONFIGURE_UI_FUNCTION);
                     return null;
                 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluatorFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluatorFactory.java
index 71e58c3bca06b80f5b2199224a00e32d3a7b44ba..6e7e7ceedb3a23ef7417c2a24b3c545d7f2b963d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluatorFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/ManagedPropertyEvaluatorFactory.java
@@ -16,8 +16,19 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.managed_property;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import ch.ethz.cisd.hotdeploy.PluginMapHolder;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.common.shared.basic.string.StringUtils;
+import ch.systemsx.cisd.openbis.generic.server.IHotDeploymentController;
 import ch.systemsx.cisd.openbis.generic.server.JythonEvaluatorPool;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
@@ -29,18 +40,71 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
  * @author Jakub Straszewski
  * @author Pawel Glyzewski
  */
-public class ManagedPropertyEvaluatorFactory
+public class ManagedPropertyEvaluatorFactory implements IManagedPropertyEvaluatorFactory
 {
+    private PluginMapHolder<IManagedPropertyEvaluator> predeployedPlugins;
+
+    public ManagedPropertyEvaluatorFactory(IHotDeploymentController hotDeploymentController,
+            String pluginDirectoryPath)
+    {
+        if (false == StringUtils.isBlank(pluginDirectoryPath))
+        {
+            hotDeploymentController.addPluginDirectory(new File(pluginDirectoryPath));
+            this.predeployedPlugins =
+                    hotDeploymentController.getPluginMap(IManagedPropertyEvaluator.class);
+        } else
+        {
+            this.predeployedPlugins = null;
+        }
+    }
 
-    public static IManagedPropertyEvaluator createManagedPropertyEvaluator(
+    @Override
+    public IManagedPropertyEvaluator createManagedPropertyEvaluator(
             EntityTypePropertyTypePE entityTypePropertyTypePE)
     {
         final ScriptPE scriptPE = entityTypePropertyTypePE.getScript();
         assert scriptPE != null && scriptPE.getScriptType() == ScriptType.MANAGED_PROPERTY;
 
-        String script = scriptPE.getScript();
+        return getManagedPropertyEvaluator(scriptPE.getPluginType(), scriptPE.getName(),
+                scriptPE.getScript());
+    }
+
+    @Override
+    public IManagedPropertyEvaluator createManagedPropertyEvaluator(
+            EntityTypePropertyType<?> entityTypePropertyType)
+    {
+        Script script = entityTypePropertyType.getScript();
+
+        return getManagedPropertyEvaluator(script.getPluginType(), script.getName(),
+                script.getScript());
+    }
+
+    private IManagedPropertyEvaluator getManagedPropertyEvaluator(PluginType pluginType,
+            String scriptName, String scriptBody)
+    {
+        switch (pluginType)
+        {
+            case JYTHON:
+                return createJythonManagedPropertyEvaluator(scriptBody);
+            case PREDEPLOYED:
+                if (predeployedPlugins == null)
+                {
+                    throw new UserFailureException(
+                            "Predeployed managed property evaluator plugins are not configured properly.");
+                }
+                IManagedPropertyEvaluator managedPropertyEvaluator =
+                        predeployedPlugins.tryGet(scriptName);
+                if (managedPropertyEvaluator == null)
+                {
+                    throw new UserFailureException("Couldn't find plugin named '" + scriptName
+                            + "'.");
+                }
+
+                return managedPropertyEvaluator;
 
-        return createJythonManagedPropertyEvaluator(script);
+        }
+
+        return null;
     }
 
     private static JythonManagedPropertyEvaluator createJythonManagedPropertyEvaluator(String script)
@@ -55,9 +119,14 @@ public class ManagedPropertyEvaluatorFactory
         }
     }
 
-    public static IManagedPropertyEvaluator createManagedPropertyEvaluator(
-            EntityTypePropertyType<?> entityTypePropertyType)
+    @Override
+    public List<String> listPredeployedPlugins()
     {
-        return createJythonManagedPropertyEvaluator(entityTypePropertyType.getScript().getScript());
+        if (predeployedPlugins == null)
+        {
+            return Collections.emptyList();
+        }
+
+        return new ArrayList<String>(predeployedPlugins.getPluginNames());
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
index 92f08854128b070eaae5bdd755567ea734672302..dfaf6eb76595b1cb17134a5bb231a467ca2c2efc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
@@ -54,6 +54,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator.LoadableFields;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
@@ -128,13 +129,15 @@ public class DataSetTranslator
 
     public static List<ExternalData> translate(List<? extends DataPE> list,
             String defaultDataStoreBaseURL, String baseIndexURL,
-            Map<Long, Set<Metaproject>> metaprojects)
+            Map<Long, Set<Metaproject>> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         ArrayList<ExternalData> result = new ArrayList<ExternalData>(list.size());
         for (DataPE dataPE : list)
         {
             ExternalData data =
                     translate(dataPE, baseIndexURL, true, metaprojects.get(dataPE.getId()),
+                            managedPropertyEvaluatorFactory,
                             ExperimentTranslator.LoadableFields.PROPERTIES);
             result.add(data);
         }
@@ -189,18 +192,25 @@ public class DataSetTranslator
     }
 
     public static ExternalData translate(DataPE dataPE, String baseIndexURL,
-            Collection<Metaproject> metaprojects, final LoadableFields... withExperimentFields)
+            Collection<Metaproject> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory,
+            final LoadableFields... withExperimentFields)
     {
-        return translate(dataPE, baseIndexURL, true, metaprojects, withExperimentFields);
+        return translate(dataPE, baseIndexURL, true, metaprojects, managedPropertyEvaluatorFactory,
+                withExperimentFields);
     }
 
     public static ExternalData translate(DataPE dataPE, String baseIndexURL, boolean withDetails,
-            Collection<Metaproject> metaprojects, final LoadableFields... withExperimentFields)
+            Collection<Metaproject> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory,
+            final LoadableFields... withExperimentFields)
     {
         ExternalData externalData = null;
         if (dataPE.isContainer())
         {
-            externalData = translateContainerDataSetProperties(dataPE, baseIndexURL, withDetails);
+            externalData =
+                    translateContainerDataSetProperties(dataPE, baseIndexURL, withDetails,
+                            managedPropertyEvaluatorFactory);
         } else if (dataPE.isLinkData())
         {
             externalData = translateLinkDataSetProperties(dataPE);
@@ -216,15 +226,16 @@ public class DataSetTranslator
         SamplePE sampleOrNull = dataPE.tryGetSample();
         ExperimentPE experiment = dataPE.getExperiment();
         Experiment translatedExperiment =
-                ExperimentTranslator
-                        .translate(experiment, baseIndexURL, null, withExperimentFields);
+                ExperimentTranslator.translate(experiment, baseIndexURL, null,
+                        managedPropertyEvaluatorFactory, withExperimentFields);
         externalData.setId(HibernateUtils.getId(dataPE));
         externalData.setCode(dataPE.getCode());
         externalData.setDataProducerCode(dataPE.getDataProducerCode());
         externalData.setDataSetType(DataSetTypeTranslator.translate(dataPE.getDataSetType(),
                 new HashMap<PropertyTypePE, PropertyType>()));
         externalData.setDerived(dataPE.isDerived());
-        externalData.setContainer(tryToTranslateContainer(dataPE.getContainer(), baseIndexURL));
+        externalData.setContainer(tryToTranslateContainer(dataPE.getContainer(), baseIndexURL,
+                managedPropertyEvaluatorFactory));
         final Collection<ExternalData> parents = new HashSet<ExternalData>();
         externalData.setParents(parents);
         for (DataPE parentPE : dataPE.getParents())
@@ -239,11 +250,11 @@ public class DataSetTranslator
         externalData.setModifier(PersonTranslator.translate(dataPE.getModifier()));
         externalData.setRegistrationDate(dataPE.getRegistrationDate());
         externalData.setSample(sampleOrNull == null ? null : fillSample(new Sample(), sampleOrNull,
-                translatedExperiment, withDetails));
+                translatedExperiment, withDetails, managedPropertyEvaluatorFactory));
         externalData.setDataStore(DataStoreTranslator.translate(dataPE.getDataStore()));
         externalData.setPermlink(PermlinkUtilities.createPermlinkURL(baseIndexURL,
                 EntityKind.DATA_SET, externalData.getIdentifier()));
-        setProperties(dataPE, externalData);
+        setProperties(dataPE, externalData, managedPropertyEvaluatorFactory);
         externalData.setExperiment(translatedExperiment);
 
         if (metaprojects != null)
@@ -255,19 +266,21 @@ public class DataSetTranslator
     }
 
     private static ContainerDataSet tryToTranslateContainer(DataPE containerOrNull,
-            String baseIndexURL)
+            String baseIndexURL, IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         return containerOrNull != null ? (ContainerDataSet) translate(containerOrNull,
-                baseIndexURL, false, null) : null;
+                baseIndexURL, false, null, managedPropertyEvaluatorFactory) : null;
     }
 
     private static ExternalData translateContainerDataSetProperties(DataPE dataPE,
-            String baseIndexURL, boolean withComponents)
+            String baseIndexURL, boolean withComponents,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         ContainerDataSet containerDataSet = new ContainerDataSet();
         if (withComponents)
         {
-            setContainedDataSets(dataPE, containerDataSet, baseIndexURL);
+            setContainedDataSets(dataPE, containerDataSet, baseIndexURL,
+                    managedPropertyEvaluatorFactory);
         }
         return containerDataSet;
     }
@@ -300,12 +313,14 @@ public class DataSetTranslator
         return dataSet;
     }
 
-    private static void setProperties(DataPE dataPE, ExternalData externalData)
+    private static void setProperties(DataPE dataPE, ExternalData externalData,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         if (HibernateUtils.isInitialized(dataPE.getProperties()))
         {
             externalData.setDataSetProperties(EntityPropertyTranslator.translate(
-                    dataPE.getProperties(), new HashMap<PropertyTypePE, PropertyType>()));
+                    dataPE.getProperties(), new HashMap<PropertyTypePE, PropertyType>(),
+                    managedPropertyEvaluatorFactory));
         } else
         {
             externalData.setDataSetProperties(new ArrayList<IEntityProperty>());
@@ -313,7 +328,8 @@ public class DataSetTranslator
     }
 
     private static Sample fillSample(Sample sample, SamplePE samplePE, Experiment experiment,
-            boolean loadSampleProperties)
+            boolean loadSampleProperties,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         sample.setId(HibernateUtils.getId(samplePE));
         sample.setPermId(samplePE.getPermId());
@@ -328,7 +344,7 @@ public class DataSetTranslator
         if (loadSampleProperties)
         {
             sample.setProperties(EntityPropertyTranslator.translate(samplePE.getProperties(),
-                    new HashMap<PropertyTypePE, PropertyType>()));
+                    new HashMap<PropertyTypePE, PropertyType>(), managedPropertyEvaluatorFactory));
         }
         return sample;
     }
@@ -347,14 +363,15 @@ public class DataSetTranslator
     }
 
     private static void setContainedDataSets(DataPE dataPE, ContainerDataSet containerDataSet,
-            String baseIndexURL)
+            String baseIndexURL, IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         List<ExternalData> containedDataSets = new ArrayList<ExternalData>();
         if (HibernateUtils.isInitialized(dataPE.getContainedDataSets()))
         {
             for (DataPE childPE : dataPE.getContainedDataSets())
             {
-                containedDataSets.add(translate(childPE, baseIndexURL, null));
+                containedDataSets.add(translate(childPE, baseIndexURL, null,
+                        managedPropertyEvaluatorFactory));
             }
         }
         containerDataSet.setContainedDataSets(containedDataSets);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/EntityHistoryTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/EntityHistoryTranslator.java
index 87c0ed0f08786a681fbcf55c9492fe966013cd2f..b2d5929bfdae03f5cb8c673bf379c7901369f3dc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/EntityHistoryTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/EntityHistoryTranslator.java
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * @author Franz-Josef Elmer
@@ -37,19 +38,21 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 public class EntityHistoryTranslator
 {
     public static List<EntityHistory> translate(List<AbstractEntityPropertyHistoryPE> history,
-            String baseIndexURL)
+            String baseIndexURL, IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         List<EntityHistory> result = new ArrayList<EntityHistory>();
         HashMap<PropertyTypePE, PropertyType> cache = new HashMap<PropertyTypePE, PropertyType>();
         for (AbstractEntityPropertyHistoryPE entityPropertyHistory : history)
         {
-            result.add(translate(entityPropertyHistory, cache, baseIndexURL));
+            result.add(translate(entityPropertyHistory, cache, baseIndexURL,
+                    managedPropertyEvaluatorFactory));
         }
         return result;
     }
 
     private static EntityHistory translate(AbstractEntityPropertyHistoryPE entityPropertyHistory,
-            Map<PropertyTypePE, PropertyType> cache, String baseIndexURL)
+            Map<PropertyTypePE, PropertyType> cache, String baseIndexURL,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         EntityHistory result = new EntityHistory();
         result.setAuthor(PersonTranslator.translate(entityPropertyHistory.getAuthor()));
@@ -81,12 +84,14 @@ public class EntityHistoryTranslator
                     case EXPERIMENT:
                         entityType = EntityKind.EXPERIMENT.getDescription();
                         result.setRelatedEntity(ExperimentTranslator.translate(
-                                (ExperimentPE) entityHistory.getRelatedEntity(), baseIndexURL, null));
+                                (ExperimentPE) entityHistory.getRelatedEntity(), baseIndexURL,
+                                null, managedPropertyEvaluatorFactory));
                         break;
                     case SAMPLE:
                         entityType = EntityKind.SAMPLE.getDescription();
                         result.setRelatedEntity(SampleTranslator.translate(
-                                (SamplePE) entityHistory.getRelatedEntity(), baseIndexURL, null));
+                                (SamplePE) entityHistory.getRelatedEntity(), baseIndexURL, null,
+                                managedPropertyEvaluatorFactory));
                         break;
                     case MATERIAL:
                 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/EntityPropertyTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/EntityPropertyTranslator.java
index 277f4383e3de7f263f346975be0497de27f3c3ab..b812658cf63a1ab92363e918d5311212b32dd83b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/EntityPropertyTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/EntityPropertyTranslator.java
@@ -26,6 +26,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * Translates {@link EntityPropertyPE} to {@link IEntityProperty}.
@@ -40,13 +41,15 @@ public final class EntityPropertyTranslator
     }
 
     public final static IEntityProperty translate(final EntityPropertyPE propertyPE,
-            Map<PropertyTypePE, PropertyType> cacheOrNull)
+            Map<PropertyTypePE, PropertyType> cacheOrNull,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        return translate(propertyPE, cacheOrNull, false);
+        return translate(propertyPE, cacheOrNull, false, managedPropertyEvaluatorFactory);
     }
 
     public final static IEntityProperty translate(final EntityPropertyPE propertyPE,
-            Map<PropertyTypePE, PropertyType> cacheOrNull, boolean rawManagedProperties)
+            Map<PropertyTypePE, PropertyType> cacheOrNull, boolean rawManagedProperties,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         final IEntityProperty basicProperty =
                 PropertyTranslatorUtils.createEntityProperty(propertyPE);
@@ -65,8 +68,9 @@ public final class EntityPropertyTranslator
                         .getVocabularyTerm()));
                 break;
             case MATERIAL:
-                basicProperty.setMaterial(MaterialTranslator.translate(
-                        propertyPE.getMaterialValue(), false, null));
+                basicProperty
+                        .setMaterial(MaterialTranslator.translate(propertyPE.getMaterialValue(),
+                                false, null, managedPropertyEvaluatorFactory));
                 break;
             default:
                 basicProperty.setValue(propertyPE.tryGetUntypedValue());
@@ -75,7 +79,9 @@ public final class EntityPropertyTranslator
         final IEntityProperty result;
         if (propertyPE.getEntityTypePropertyType().isManaged() && rawManagedProperties == false)
         {
-            result = PropertyTranslatorUtils.createManagedEntityProperty(propertyPE, basicProperty);
+            result =
+                    PropertyTranslatorUtils.createManagedEntityProperty(propertyPE, basicProperty,
+                            managedPropertyEvaluatorFactory);
             PropertyTranslatorUtils.initializeEntityProperty(result, propertyType, ordinal);
         } else
         {
@@ -87,7 +93,8 @@ public final class EntityPropertyTranslator
 
     public final static List<IEntityProperty> translateRaw(
             final Set<? extends EntityPropertyPE> list,
-            Map<PropertyTypePE, PropertyType> cacheOrNull)
+            Map<PropertyTypePE, PropertyType> cacheOrNull,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         if (list == null)
         {
@@ -96,13 +103,14 @@ public final class EntityPropertyTranslator
         final List<IEntityProperty> result = new ArrayList<IEntityProperty>();
         for (final EntityPropertyPE property : list)
         {
-            result.add(translate(property, cacheOrNull, true));
+            result.add(translate(property, cacheOrNull, true, managedPropertyEvaluatorFactory));
         }
         return result;
     }
 
     public final static List<IEntityProperty> translate(final Set<? extends EntityPropertyPE> list,
-            Map<PropertyTypePE, PropertyType> cacheOrNull)
+            Map<PropertyTypePE, PropertyType> cacheOrNull,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         if (list == null)
         {
@@ -111,13 +119,14 @@ public final class EntityPropertyTranslator
         final List<IEntityProperty> result = new ArrayList<IEntityProperty>();
         for (final EntityPropertyPE property : list)
         {
-            result.add(translate(property, cacheOrNull));
+            result.add(translate(property, cacheOrNull, managedPropertyEvaluatorFactory));
         }
         return result;
     }
 
     public final static IEntityProperty[] translate(final EntityPropertyPE[] list,
-            Map<PropertyTypePE, PropertyType> cacheOrNull)
+            Map<PropertyTypePE, PropertyType> cacheOrNull,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         if (list == null)
         {
@@ -127,7 +136,7 @@ public final class EntityPropertyTranslator
         int idx = 0;
         for (final EntityPropertyPE property : list)
         {
-            result[idx++] = translate(property, cacheOrNull);
+            result[idx++] = translate(property, cacheOrNull, managedPropertyEvaluatorFactory);
         }
         return result;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ExperimentTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ExperimentTranslator.java
index 0cce6f159e11dd260695032a635e324cf8706670..be7705c9bd51fe3afbb7dbcafed11dba1db99b58 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ExperimentTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ExperimentTranslator.java
@@ -33,6 +33,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -54,18 +55,21 @@ public final class ExperimentTranslator
     }
 
     private static void setProperties(final ExperimentPE experiment, final Experiment result,
-            final boolean rawManagedProperties)
+            final boolean rawManagedProperties,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         if (experiment.isPropertiesInitialized())
         {
             if (rawManagedProperties)
             {
                 result.setProperties(EntityPropertyTranslator.translateRaw(
-                        experiment.getProperties(), new HashMap<PropertyTypePE, PropertyType>()));
+                        experiment.getProperties(), new HashMap<PropertyTypePE, PropertyType>(),
+                        managedPropertyEvaluatorFactory));
             } else
             {
                 result.setProperties(EntityPropertyTranslator.translate(experiment.getProperties(),
-                        new HashMap<PropertyTypePE, PropertyType>()));
+                        new HashMap<PropertyTypePE, PropertyType>(),
+                        managedPropertyEvaluatorFactory));
             }
         } else
         {
@@ -99,13 +103,17 @@ public final class ExperimentTranslator
     }
 
     public final static Experiment translate(final ExperimentPE experiment, String baseIndexURL,
-            Collection<Metaproject> metaprojects, final LoadableFields... withFields)
+            Collection<Metaproject> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory,
+            final LoadableFields... withFields)
     {
-        return translate(experiment, baseIndexURL, false, metaprojects, withFields);
+        return translate(experiment, baseIndexURL, false, metaprojects,
+                managedPropertyEvaluatorFactory, withFields);
     }
 
     public final static Experiment translate(final ExperimentPE experiment, String baseIndexURL,
             final boolean rawManagedProperties, Collection<Metaproject> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory,
             final LoadableFields... withFields)
     {
         if (experiment == null)
@@ -133,7 +141,8 @@ public final class ExperimentTranslator
             switch (field)
             {
                 case PROPERTIES:
-                    setProperties(experiment, result, rawManagedProperties);
+                    setProperties(experiment, result, rawManagedProperties,
+                            managedPropertyEvaluatorFactory);
                     break;
                 case ATTACHMENTS:
                     result.setAttachments(AttachmentTranslator.translate(
@@ -154,14 +163,16 @@ public final class ExperimentTranslator
 
     // NOTE: when translating list of experiments managed properties will contain raw value
     public final static List<Experiment> translate(final List<ExperimentPE> experiments,
-            String baseIndexURL, Map<Long, Set<Metaproject>> metaprojects)
+            String baseIndexURL, Map<Long, Set<Metaproject>> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         final List<Experiment> result = new ArrayList<Experiment>(experiments.size());
         for (final ExperimentPE experiment : experiments)
         {
             HibernateUtils.initialize(experiment.getProperties());
             result.add(ExperimentTranslator.translate(experiment, baseIndexURL, true,
-                    metaprojects.get(experiment.getId()), LoadableFields.PROPERTIES));
+                    metaprojects.get(experiment.getId()), managedPropertyEvaluatorFactory,
+                    LoadableFields.PROPERTIES));
         }
         return result;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/MaterialTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/MaterialTranslator.java
index bcd66659d77c1f681cd479f94050b931d4995b7c..64e655fcdb046f7e46e862d8bbebf2287e5c583f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/MaterialTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/MaterialTranslator.java
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -54,24 +55,28 @@ public final class MaterialTranslator
     }
 
     public final static List<Material> translate(final List<MaterialPE> materials,
-            Map<Long, Set<Metaproject>> metaprojects)
+            Map<Long, Set<Metaproject>> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         final List<Material> result = new ArrayList<Material>();
         for (final MaterialPE material : materials)
         {
-            result.add(MaterialTranslator.translate(material, metaprojects.get(material.getId())));
+            result.add(MaterialTranslator.translate(material, metaprojects.get(material.getId()),
+                    managedPropertyEvaluatorFactory));
         }
         return result;
     }
 
     public final static Material translate(final MaterialPE materialPE,
-            Collection<Metaproject> metaprojects)
+            Collection<Metaproject> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        return translate(materialPE, true, metaprojects);
+        return translate(materialPE, true, metaprojects, managedPropertyEvaluatorFactory);
     }
 
     public final static Material translate(final MaterialPE materialPE,
-            final boolean withProperties, Collection<Metaproject> metaprojects)
+            final boolean withProperties, Collection<Metaproject> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         if (materialPE == null)
         {
@@ -89,7 +94,7 @@ public final class MaterialTranslator
         result.setRegistrationDate(materialPE.getRegistrationDate());
         if (withProperties)
         {
-            setProperties(materialPE, result);
+            setProperties(materialPE, result, managedPropertyEvaluatorFactory);
         }
 
         if (metaprojects != null)
@@ -100,12 +105,13 @@ public final class MaterialTranslator
         return result;
     }
 
-    private static void setProperties(final MaterialPE materialPE, final Material result)
+    private static void setProperties(final MaterialPE materialPE, final Material result,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         if (materialPE.isPropertiesInitialized())
         {
             result.setProperties(EntityPropertyTranslator.translate(materialPE.getProperties(),
-                    new HashMap<PropertyTypePE, PropertyType>()));
+                    new HashMap<PropertyTypePE, PropertyType>(), managedPropertyEvaluatorFactory));
         } else
         {
             result.setProperties(new ArrayList<IEntityProperty>());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PropertyTranslatorUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PropertyTranslatorUtils.java
index b25816ebb6b5cf47c325149ce5e0dd2cd47a6eeb..185507a261f8477f0002b4dd460ac7dc7d52beef 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PropertyTranslatorUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PropertyTranslatorUtils.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.shared.translator;
 
 import ch.systemsx.cisd.common.jython.evaluator.EvaluatorException;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.AbstractEntityAdaptor;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
@@ -29,7 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermEntityPro
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluator;
-import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
  * Some utility methods for entity property translations.
@@ -74,16 +75,21 @@ final class PropertyTranslatorUtils
      * Creates a managed {@link IEntityProperty} wrapping given <var>basicProperty</var>.
      */
     static IEntityProperty createManagedEntityProperty(EntityPropertyPE property,
-            IEntityProperty basicProperty)
+            IEntityProperty basicProperty,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         final ManagedEntityProperty result = new ManagedEntityProperty(basicProperty);
         try
         {
             // TODO move this outside of translator
             IManagedPropertyEvaluator evaluator =
-                    ManagedPropertyEvaluatorFactory.createManagedPropertyEvaluator(property
+                    managedPropertyEvaluatorFactory.createManagedPropertyEvaluator(property
                             .getEntityTypePropertyType());
-            evaluator.configureUI(result, property);
+
+            // we can provide null parameters, as we are sure, that this is a managed property (so
+            // it can't be dynamic property)
+            evaluator.configureUI(result,
+                    AbstractEntityAdaptor.adaptEntityProperty(property, null, null));
         } catch (EvaluatorException ex)
         {
             result.setValue(BasicConstant.ERROR_PROPERTY_PREFIX + ex.getMessage());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java
index 7f00ce871dd44ec11c0a53a19d1d9a4d4d7223e8..de10d6025859dd311730134d22920023cedcfe6f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java
@@ -36,6 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleParentWithDerivedDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator.LoadableFields;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
@@ -52,12 +53,14 @@ public final class SampleTranslator
     }
 
     public static List<Sample> translate(final List<SamplePE> samples, String baseIndexURL,
-            Map<Long, Set<Metaproject>> metaprojects)
+            Map<Long, Set<Metaproject>> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         final List<Sample> list = new ArrayList<Sample>(samples.size());
         for (final SamplePE sample : samples)
         {
-            list.add(translate(sample, baseIndexURL, metaprojects.get(sample.getId())));
+            list.add(translate(sample, baseIndexURL, metaprojects.get(sample.getId()),
+                    managedPropertyEvaluatorFactory));
         }
         return list;
     }
@@ -87,14 +90,17 @@ public final class SampleTranslator
     }
 
     public final static Sample translate(final SamplePE samplePE, String baseIndexURL,
-            Collection<Metaproject> metaprojects)
+            Collection<Metaproject> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        return translate(samplePE, baseIndexURL, true, false, metaprojects);
+        return translate(samplePE, baseIndexURL, true, false, metaprojects,
+                managedPropertyEvaluatorFactory);
     }
 
     public final static Sample translate(final SamplePE samplePE, String baseIndexURL,
             final boolean withDetails, boolean withContainedSamples,
-            Collection<Metaproject> metaprojects)
+            Collection<Metaproject> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         if (samplePE == null)
         {
@@ -106,13 +112,14 @@ public final class SampleTranslator
         final int generatedFromDep =
                 getPositiveIntegerValue(samplePE.getSampleType().getGeneratedFromHierarchyDepth());
         return translate(samplePE, baseIndexURL, containerDep, generatedFromDep, withDetails,
-                withContainedSamples, metaprojects);
+                withContainedSamples, metaprojects, managedPropertyEvaluatorFactory);
 
     }
 
     private final static Sample translate(final SamplePE samplePE, String baseIndexURL,
             final int containerDep, final int generatedFromDep, final boolean withDetails,
-            final boolean withContainedSamples, Collection<Metaproject> metaprojects)
+            final boolean withContainedSamples, Collection<Metaproject> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         final Sample result = new Sample();
         setCodes(result, samplePE);
@@ -137,9 +144,9 @@ public final class SampleTranslator
             result.setRegistrator(PersonTranslator.translate(samplePE.getRegistrator()));
             result.setModifier(PersonTranslator.translate(samplePE.getModifier()));
             result.setRegistrationDate(samplePE.getRegistrationDate());
-            setProperties(result, samplePE);
+            setProperties(result, samplePE, managedPropertyEvaluatorFactory);
             result.setExperiment(ExperimentTranslator.translate(samplePE.getExperiment(),
-                    baseIndexURL, null, LoadableFields.PROPERTIES));
+                    baseIndexURL, null, managedPropertyEvaluatorFactory, LoadableFields.PROPERTIES));
             List<Attachment> attachments;
             if (samplePE.attachmentsInitialized() == false)
             {
@@ -156,7 +163,7 @@ public final class SampleTranslator
             if (HibernateUtils.isInitialized(samplePE.getContainer()))
             {
                 result.setContainer(translate(samplePE.getContainer(), baseIndexURL,
-                        containerDep - 1, 0, false, false, null));
+                        containerDep - 1, 0, false, false, null, managedPropertyEvaluatorFactory));
             }
         }
         if (generatedFromDep > 0 && samplePE.getParentRelationships() != null)
@@ -166,7 +173,7 @@ public final class SampleTranslator
                 for (SamplePE parent : samplePE.getParents())
                 {
                     result.addParent(translate(parent, baseIndexURL, 0, generatedFromDep - 1,
-                            false, false, null));
+                            false, false, null, managedPropertyEvaluatorFactory));
                 }
             }
         }
@@ -177,7 +184,8 @@ public final class SampleTranslator
             for (SamplePE containedPE : samplePE.getContained())
             {
                 Sample containedSample =
-                        translate(containedPE, baseIndexURL, 0, 0, false, false, null);
+                        translate(containedPE, baseIndexURL, 0, 0, false, false, null,
+                                managedPropertyEvaluatorFactory);
                 containedSamples.add(containedSample);
 
             }
@@ -198,12 +206,13 @@ public final class SampleTranslator
         result.setCode(IdentifierHelper.extractCode(samplePE));
     }
 
-    private static void setProperties(final Sample result, final SamplePE samplePE)
+    private static void setProperties(final Sample result, final SamplePE samplePE,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         if (samplePE.isPropertiesInitialized())
         {
             result.setProperties(EntityPropertyTranslator.translate(samplePE.getProperties(),
-                    new HashMap<PropertyTypePE, PropertyType>()));
+                    new HashMap<PropertyTypePE, PropertyType>(), managedPropertyEvaluatorFactory));
         } else
         {
             result.setProperties(new ArrayList<IEntityProperty>());
@@ -212,17 +221,19 @@ public final class SampleTranslator
 
     public final static SampleParentWithDerived translate(
             final SampleParentWithDerivedDTO sampleGenerationDTO, String baseIndexURL,
-            Collection<Metaproject> metaprojects)
+            Collection<Metaproject> metaprojects,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         final SampleParentWithDerived sampleGeneration = new SampleParentWithDerived();
 
         sampleGeneration.setParent(SampleTranslator.translate(sampleGenerationDTO.getParent(),
-                baseIndexURL, metaprojects));
+                baseIndexURL, metaprojects, managedPropertyEvaluatorFactory));
 
         final List<Sample> generated = new ArrayList<Sample>();
         for (SamplePE samplePE : sampleGenerationDTO.getDerived())
         {
-            generated.add(SampleTranslator.translate(samplePE, baseIndexURL, false, false, null));
+            generated.add(SampleTranslator.translate(samplePE, baseIndexURL, false, false, null,
+                    managedPropertyEvaluatorFactory));
         }
         sampleGeneration.setDerived(generated.toArray(new Sample[generated.size()]));
         return sampleGeneration;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ScriptTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ScriptTranslator.java
index 2e5dbe8b03be14c588d0e907e46a76855aff7bb7..34a8f2d14134128cdcc61efc18c5934928755607 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ScriptTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/ScriptTranslator.java
@@ -53,6 +53,7 @@ public final class ScriptTranslator
         final Script result = new Script();
         result.setId(HibernateUtils.getId(script));
         result.setScriptType(script.getScriptType());
+        result.setPluginType(script.getPluginType());
         result.setEntityKind(script.getEntityKind());
         result.setName(script.getName());
         result.setDescription(script.getDescription());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java
index 1d485837a8be74aecdb802ef5f30616f9c798ac0..4c50c32cd93e070c57d3e1910f5581d086bb8866 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java
@@ -28,6 +28,7 @@ import ch.systemsx.cisd.common.exceptions.NotImplementedException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext;
 import ch.systemsx.cisd.openbis.generic.server.AbstractServer;
+import ch.systemsx.cisd.openbis.generic.server.ComponentNames;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.AuthorizationGuard;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.NewSamplePredicate;
@@ -47,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleParentWithDerivedDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MetaprojectTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator;
 import ch.systemsx.cisd.openbis.plugin.demo.shared.IDemoServer;
@@ -63,6 +65,9 @@ public final class DemoServer extends AbstractServer<IDemoServer> implements IDe
     @Resource(name = ResourceNames.DEMO_BUSINESS_OBJECT_FACTORY)
     private IDemoBusinessObjectFactory businessObjectFactory;
 
+    @Resource(name = ComponentNames.MANAGED_PROPERTY_EVALUATOR_FACTORY)
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     public DemoServer()
     {
     }
@@ -128,7 +133,7 @@ public final class DemoServer extends AbstractServer<IDemoServer> implements IDe
                 getDAOFactory().getMetaprojectDAO().listMetaprojectsForEntity(
                         session.tryGetPerson(), sample);
         return SampleTranslator.translate(sampleInfo, session.getBaseIndexURL(),
-                MetaprojectTranslator.translate(metaprojectPEs));
+                MetaprojectTranslator.translate(metaprojectPEs), managedPropertyEvaluatorFactory);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index 5983cb5bf2de2d1ecfe5eb961cc51a337e073da9..27e478fad3369f3c862f22d926932edba8fde96f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -38,6 +38,7 @@ import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext;
 import ch.systemsx.cisd.openbis.generic.server.AbstractASyncAction;
 import ch.systemsx.cisd.openbis.generic.server.AbstractServer;
+import ch.systemsx.cisd.openbis.generic.server.ComponentNames;
 import ch.systemsx.cisd.openbis.generic.server.MaterialHelper;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.AuthorizationGuard;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.Capability;
@@ -118,6 +119,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierF
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.AttachmentTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MetaprojectTranslator;
@@ -144,6 +146,9 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
     @Resource(name = ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames.GENERIC_PLUGIN_SERVER)
     private IGenericServer genericServer;
 
+    @Resource(name = ComponentNames.MANAGED_PROPERTY_EVALUATOR_FACTORY)
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     public GenericServer()
     {
     }
@@ -194,7 +199,7 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
                         session.tryGetPerson(), sample);
         return SampleTranslator.translate(getSampleTypeSlaveServerPlugin(sample.getSampleType())
                 .getSampleInfo(session, sample), session.getBaseIndexURL(), MetaprojectTranslator
-                .translate(metaprojectPEs));
+                .translate(metaprojectPEs), managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -240,7 +245,7 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
                     "No experiment could be found with given identifier '%s'.", identifier);
         }
         return ExperimentTranslator.translate(experiment, session.getBaseIndexURL(),
-                MetaprojectTranslator.translate(metaprojectPEs),
+                MetaprojectTranslator.translate(metaprojectPEs), managedPropertyEvaluatorFactory,
                 ExperimentTranslator.LoadableFields.PROPERTIES,
                 ExperimentTranslator.LoadableFields.ATTACHMENTS);
     }
@@ -257,7 +262,7 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
                 getDAOFactory().getMetaprojectDAO().listMetaprojectsForEntity(
                         session.tryGetPerson(), experiment);
         return ExperimentTranslator.translate(experiment, session.getBaseIndexURL(),
-                MetaprojectTranslator.translate(metaprojectPEs),
+                MetaprojectTranslator.translate(metaprojectPEs), managedPropertyEvaluatorFactory,
                 ExperimentTranslator.LoadableFields.PROPERTIES,
                 ExperimentTranslator.LoadableFields.ATTACHMENTS);
     }
@@ -985,7 +990,7 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
     {
         final MaterialHelper materialHelper =
                 new MaterialHelper(session, businessObjectFactory, getDAOFactory(),
-                        getPropertiesBatchManager());
+                        getPropertiesBatchManager(), managedPropertyEvaluatorFactory);
         return materialHelper;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index 2aa419021592335efa44c87180ef1712ce414fad..06209ed3c404bab61593471968ad004363d062f0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -969,6 +969,12 @@ clear: "Clear",
 progress_uploading: "Uploading",
 progress_processing: "Processing",
 
+//
+// Pregeployed Plugins
+//
+predeployed_plugin_name: "Plugin name",
+plugin_type: "Plugin Type",
+
  // LAST LINE: KEEP IT AT THE END
   lastline: "" // we need a line without a comma
 };
diff --git a/openbis/source/java/genericApplicationContext.xml b/openbis/source/java/genericApplicationContext.xml
index 9861c09abba5f698c44ef791a4ae598936a8cdb1..e475a587ab2f77a3fe372f2717c2c105aa1c26dd 100644
--- a/openbis/source/java/genericApplicationContext.xml
+++ b/openbis/source/java/genericApplicationContext.xml
@@ -19,9 +19,35 @@
 
 	<bean id="memory-monitor" class="ch.systemsx.cisd.common.monitoring.JMXMemoryMonitorSpringBean" />
 
+  <bean id="hot-deployment-plugin-container" class="ch.systemsx.cisd.openbis.generic.server.HotDeploymentController" />
+
+  <bean id="entity-validation-factory" class="ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.EntityValidatorFactory" >
+    <constructor-arg ref="hot-deployment-plugin-container" />
+    <constructor-arg value="${entity-validation-plugins-directory}" />
+  </bean>
+  
+  <bean id="dynamic-property-calculator-factory"
+        class="ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.DynamicPropertyCalculatorFactory">
+        <constructor-arg ref="hot-deployment-plugin-container" />
+        <constructor-arg value="${dynamic-property-plugins-directory}" />
+  </bean>
+  
+  <bean id="managed-property-evaluator-factory"
+        class="ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory">
+        <constructor-arg ref="hot-deployment-plugin-container" />
+        <constructor-arg value="${managed-property-plugins-directory}" />
+  </bean>
+  
+  <bean id="properties-batch-manager" class="ch.systemsx.cisd.openbis.generic.server.business.PropertiesBatchManager" >
+        <constructor-arg ref="managed-property-evaluator-factory" />
+  </bean>
+
     <bean id="transaction-manager"
         class="ch.systemsx.cisd.openbis.generic.server.dataaccess.db.OpenBISHibernateTransactionManager">
         <constructor-arg ref="dao-factory" />
+        <constructor-arg ref="entity-validation-factory" />
+        <constructor-arg ref="dynamic-property-calculator-factory" />
+        <constructor-arg ref="managed-property-evaluator-factory" />
         <property name="sessionFactory" ref="hibernate-session-factory" />
         <property name="jdbcExceptionTranslator" ref="exception-translator" />
         <property name="dynamicPropertiesInterceptor">
@@ -40,6 +66,8 @@
         <constructor-arg ref="dao-factory" />
         <constructor-arg ref="full-text-index-updater" />
         <constructor-arg ref="dynamic-property-scheduler" />
+        <constructor-arg ref="dynamic-property-calculator-factory" />
+        <constructor-arg ref="managed-property-evaluator-factory" />
     </bean>
     
     <bean id="relationship-service"
@@ -108,6 +136,7 @@
         <constructor-arg ref="relationship-service" />
         <constructor-arg ref="entity-operation-checker" />
         <constructor-arg ref="service-conversation-client-manager" />
+        <constructor-arg ref="managed-property-evaluator-factory" />
     </bean>
 
     <bean id="last-modification-state"
@@ -135,6 +164,9 @@
         <constructor-arg ref="common-business-object-factory" />
         <constructor-arg ref="data-store-service-registrator" />
         <constructor-arg ref="last-modification-state" />
+        <constructor-arg ref="entity-validation-factory" />
+        <constructor-arg ref="dynamic-property-calculator-factory" />
+        <constructor-arg ref="managed-property-evaluator-factory" />
         <property name="userForAnonymousLogin" value="${user-for-anonymous-login}"/>
         <property name="CISDHelpdeskEmail" value="cisd.helpdesk@bsse.ethz.ch" />
         <property name="defaultPutDataStoreServerCode" value="${dss-rpc.put.dss-code}" />
@@ -206,6 +238,7 @@
         <constructor-arg ref="etl-entity-operation-checker" />
         <constructor-arg ref="data-store-service-registrator" />
         <constructor-arg ref="dss-based-data-source-provider" />
+        <constructor-arg ref="managed-property-evaluator-factory" />
         <property name="conversationClient" ref="service-conversation-client-manager" />
         <property name="conversationServer" ref="service-conversation-server-manager" />
     </bean>
diff --git a/openbis/source/sql/generic/130/schema-130.sql b/openbis/source/sql/generic/130/schema-130.sql
index 1d36b24ebcfd42dddcdc88b681eead8d1dfee597..73adf14d5365908a4a0a24ad9cd81dd15b5f4fe5 100644
--- a/openbis/source/sql/generic/130/schema-130.sql
+++ b/openbis/source/sql/generic/130/schema-130.sql
@@ -52,7 +52,7 @@ CREATE TABLE QUERIES (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, NAME VARCHA
 CREATE TABLE relationship_types (id TECH_ID NOT NULL, code CODE NOT NULL, label COLUMN_LABEL, parent_label COLUMN_LABEL, child_label COLUMN_LABEL, description DESCRIPTION_2000, registration_timestamp TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, pers_id_registerer TECH_ID NOT NULL, is_managed_internally BOOLEAN_CHAR NOT NULL DEFAULT 'F', is_internal_namespace BOOLEAN_CHAR NOT NULL DEFAULT 'F', dbin_id TECH_ID NOT NULL);
 CREATE TABLE sample_relationships_all (id TECH_ID NOT NULL, sample_id_parent TECH_ID NOT NULL, relationship_id TECH_ID NOT NULL, sample_id_child TECH_ID NOT NULL, del_id TECH_ID, PERS_ID_AUTHOR TECH_ID, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);
 
-CREATE TABLE scripts (ID TECH_ID NOT NULL,DBIN_ID TECH_ID NOT NULL,NAME VARCHAR(200) NOT NULL, SCRIPT_TYPE SCRIPT_TYPE NOT NULL, DESCRIPTION DESCRIPTION_2000,SCRIPT TEXT_VALUE NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,ENTITY_KIND ENTITY_KIND);
+CREATE TABLE scripts (ID TECH_ID NOT NULL,DBIN_ID TECH_ID NOT NULL,NAME VARCHAR(200) NOT NULL, SCRIPT_TYPE SCRIPT_TYPE NOT NULL, DESCRIPTION DESCRIPTION_2000,SCRIPT TEXT_VALUE,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,ENTITY_KIND ENTITY_KIND, PLUGIN_TYPE PLUGIN_TYPE NOT NULL DEFAULT 'JYTHON');
 
 CREATE TABLE CORE_PLUGINS (ID TECH_ID NOT NULL, NAME VARCHAR(200) NOT NULL, VERSION INTEGER NOT NULL, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MASTER_REG_SCRIPT TEXT_VALUE);
 
@@ -553,7 +553,7 @@ ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_SCRIPT_FK FOREIGN K
 ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_SCRIPT_FK FOREIGN KEY (SCRIPT_ID) REFERENCES SCRIPTS(ID);
 ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_SCRIPT_FK FOREIGN KEY (SCRIPT_ID) REFERENCES SCRIPTS(ID);
 ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_SCRIPT_FK FOREIGN KEY (SCRIPT_ID) REFERENCES SCRIPTS(ID);
-ALTER TABLE ONLY POST_REGISTRATION_DATASET_QUEUE ADD CONSTRAINT prdq_ds_fk FOREIGN KEY (ds_id) REFERENCES data_all(id) ON DELETE CASCADE;
+ALTER TABLE ONLY POST_REGISTRATION_DATASET_QUEUE ADD CONSTRAINT prdq_ds_fk FOREIGN KEY (ds_id) REFERENCES data_all(id);
 
 ALTER TABLE EXPERIMENT_RELATIONSHIPS_HISTORY ADD CONSTRAINT EXRELH_MAIN_EXPE_FK FOREIGN KEY (MAIN_EXPE_ID) REFERENCES EXPERIMENTS_ALL(ID) ON DELETE CASCADE;
 ALTER TABLE EXPERIMENT_RELATIONSHIPS_HISTORY ADD CONSTRAINT EXRELH_SAMP_FK FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES_ALL(ID) ON DELETE SET NULL;
@@ -645,6 +645,8 @@ ALTER TABLE METAPROJECT_ASSIGNMENTS_ALL ADD CONSTRAINT METAPROJECT_ASSIGNMENTS_A
 	(EXPE_ID IS NULL AND SAMP_ID IS NULL AND DATA_ID IS NOT NULL AND MATE_ID IS NULL) OR
 	(EXPE_ID IS NULL AND SAMP_ID IS NULL AND DATA_ID IS NULL AND MATE_ID IS NOT NULL));
 
+ALTER TABLE SCRIPTS ADD CONSTRAINT SCRIPT_NN_CK CHECK
+  (PLUGIN_TYPE = 'PREDEPLOYED' OR SCRIPT IS NOT NULL);
 
 -- Creating indices
 
diff --git a/openbis/source/sql/postgresql/130/domains-130.sql b/openbis/source/sql/postgresql/130/domains-130.sql
index c6fffb75a11f1db265641cae942166cc2b069ea9..c9abd89d7154f395e4e9242025fe572a0dff7cd0 100644
--- a/openbis/source/sql/postgresql/130/domains-130.sql
+++ b/openbis/source/sql/postgresql/130/domains-130.sql
@@ -28,3 +28,4 @@ CREATE DOMAIN ENTITY_KIND AS VARCHAR(40) CHECK (VALUE IN ('SAMPLE', 'EXPERIMENT'
 CREATE DOMAIN SCRIPT_TYPE AS VARCHAR(40) CHECK (VALUE IN ('DYNAMIC_PROPERTY', 'MANAGED_PROPERTY', 'ENTITY_VALIDATION'));
 CREATE DOMAIN IDENTIFIER AS VARCHAR(200);
 CREATE DOMAIN DATA_SET_KIND AS VARCHAR(40) CHECK (VALUE IN ('PHYSICAL', 'LINK', 'CONTAINER'));
+CREATE DOMAIN PLUGIN_TYPE AS VARCHAR(40) CHECK (VALUE IN ('JYTHON', 'PREDEPLOYED'));
\ No newline at end of file
diff --git a/openbis/source/sql/postgresql/migration/migration-129-130.sql b/openbis/source/sql/postgresql/migration/migration-129-130.sql
index 5031161c8e73a8eeb6c95cf3d25046659bbee17e..70657b73e5f1b254edafb6b718b92618d165961e 100644
--- a/openbis/source/sql/postgresql/migration/migration-129-130.sql
+++ b/openbis/source/sql/postgresql/migration/migration-129-130.sql
@@ -1,4 +1,12 @@
 -- Migration from 129 to 130
 
+CREATE DOMAIN PLUGIN_TYPE AS VARCHAR(40) CHECK (VALUE IN ('JYTHON', 'PREDEPLOYED'));
+
+ALTER TABLE SCRIPTS ADD COLUMN PLUGIN_TYPE PLUGIN_TYPE NOT NULL DEFAULT 'JYTHON';
+ALTER TABLE SCRIPTS ALTER COLUMN SCRIPT DROP NOT NULL;
+ALTER TABLE SCRIPTS ADD CONSTRAINT SCRIPT_NN_CK CHECK
+  (PLUGIN_TYPE = 'PREDEPLOYED' OR SCRIPT IS NOT NULL);
+  
 alter table post_registration_dataset_queue drop CONSTRAINT prdq_ds_fk;
 alter table post_registration_dataset_queue add CONSTRAINT prdq_ds_fk FOREIGN KEY (ds_id) REFERENCES data_all (id) ON DELETE CASCADE;
+  
\ No newline at end of file
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
index c8db29fd16f19b7fde0de5e73e122c3ebd5615aa..cfd01667404cc59a4b901c60a2a28861430d2a6e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
@@ -35,6 +35,8 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.authentication.Principal;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.DynamicPropertyCalculatorFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.EntityValidatorFactory;
 import ch.systemsx.cisd.openbis.generic.server.plugin.IDataSetTypeSlaveServerPlugin;
 import ch.systemsx.cisd.openbis.generic.server.plugin.ISampleTypeSlaveServerPlugin;
 import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase;
@@ -96,6 +98,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.builders.ExperimentTypePEBuil
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DtoConverters;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
@@ -128,7 +131,10 @@ public final class CommonServerTest extends AbstractServerTestCase
         CommonServer server =
                 new CommonServer(authenticationService, sessionManager, daoFactory,
                         propertiesBatchManager, commonBusinessObjectFactory,
-                        dataStoreServiceRegistrator, new LastModificationState());
+                        dataStoreServiceRegistrator, new LastModificationState(),
+                        new EntityValidatorFactory(null, null),
+                        new DynamicPropertyCalculatorFactory(null, null),
+                        new ManagedPropertyEvaluatorFactory(null, null));
         server.setSampleTypeSlaveServerPlugin(sampleTypeSlaveServerPlugin);
         server.setDataSetTypeSlaveServerPlugin(dataSetTypeSlaveServerPlugin);
         server.setBaseIndexURL(SESSION_TOKEN, BASE_INDEX_URL);
@@ -575,7 +581,8 @@ public final class CommonServerTest extends AbstractServerTestCase
         dataStorePE.setCode("DST");
         externalDataPE.setDataStore(dataStorePE);
         final ExternalData externalData =
-                DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null);
+                DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null,
+                        new ManagedPropertyEvaluatorFactory(null, null));
         prepareGetSession();
         final boolean showOnlyDirectlyConnected = true;
         context.checking(new Expectations()
@@ -614,7 +621,8 @@ public final class CommonServerTest extends AbstractServerTestCase
         dataStorePE.setCode("DST");
         externalDataPE.setDataStore(dataStorePE);
         final ExternalData externalData =
-                DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null);
+                DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null,
+                        new ManagedPropertyEvaluatorFactory(null, null));
         prepareGetSession();
         context.checking(new Expectations()
             {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
index bf2592f74a9e120f9ce53d4ec8207283c50575aa..0ad2b51cec082156ad227aed4932442fad9bf8cc 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
@@ -124,6 +124,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.builders.DatabaseInstancePEBu
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 
 /**
  * @author Franz-Josef Elmer
@@ -167,6 +169,8 @@ public class ETLServiceTest extends AbstractServerTestCase
 
     private ISessionManager<Session> sessionManagerForEntityOperations;
 
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     private PersonPE sessionPerson;
 
     private IDataStoreDataSourceManager dataSourceManager;
@@ -189,6 +193,7 @@ public class ETLServiceTest extends AbstractServerTestCase
                 context.mock(ISessionManager.class, "sessionManagerForEntityOperations");
         sessionPerson = new PersonPE();
         session.setPerson(sessionPerson);
+        managedPropertyEvaluatorFactory = new ManagedPropertyEvaluatorFactory(null, null);
     }
 
     @Test
@@ -1520,7 +1525,7 @@ public class ETLServiceTest extends AbstractServerTestCase
                 new ETLService(authenticationService, sessionManager, daoFactory,
                         propertiesBatchManager, boFactory, dssfactory, null,
                         entityOperationChecker, dataStoreServiceRegistrator, dataSourceManager,
-                        sessionManagerForEntityOperations);
+                        sessionManagerForEntityOperations, managedPropertyEvaluatorFactory);
         etlService.setConversationClient(conversationClient);
         etlService.setConversationServer(conversationServer);
         etlService.setDisplaySettingsProvider(new DisplaySettingsProvider());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExperimentValidatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExperimentValidatorTest.java
index 34631e0c4609f7502cffd17cc20cc13961815120..e8b6f638fd0630b5f9b041e504e2828b0bfc8749 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExperimentValidatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExperimentValidatorTest.java
@@ -21,6 +21,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationTestCase;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
 
 /**
@@ -38,7 +39,8 @@ public class ExperimentValidatorTest extends AuthorizationTestCase
         ExperimentValidator validator = new ExperimentValidator();
         PersonPE person = createPersonWithRoleAssignments();
         assertEquals(true, validator.isValid(person, ExperimentTranslator.translate(
-                createExperiment(createAnotherSpace()), BASE_URL, null)));
+                createExperiment(createAnotherSpace()), BASE_URL, null,
+                new ManagedPropertyEvaluatorFactory(null, null))));
     }
 
     @Test
@@ -46,8 +48,9 @@ public class ExperimentValidatorTest extends AuthorizationTestCase
     {
         ExperimentValidator validator = new ExperimentValidator();
         PersonPE person = createPersonWithRoleAssignments();
-        assertEquals(true, validator.isValid(person,
-                ExperimentTranslator.translate(createExperiment(createSpace()), BASE_URL, null)));
+        assertEquals(true, validator.isValid(person, ExperimentTranslator.translate(
+                createExperiment(createSpace()), BASE_URL, null,
+                new ManagedPropertyEvaluatorFactory(null, null))));
     }
 
     @Test
@@ -56,9 +59,8 @@ public class ExperimentValidatorTest extends AuthorizationTestCase
         ExperimentValidator validator = new ExperimentValidator();
         PersonPE person = createPersonWithRoleAssignments();
         SpacePE group = createSpace("blabla", createAnotherDatabaseInstance());
-        assertEquals(
-                false,
-                validator.isValid(person,
-                        ExperimentTranslator.translate(createExperiment(group), BASE_URL, null)));
+        assertEquals(false, validator.isValid(person, ExperimentTranslator.translate(
+                createExperiment(group), BASE_URL, null, new ManagedPropertyEvaluatorFactory(null,
+                        null))));
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExternalDataValidatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExternalDataValidatorTest.java
index bac7acf58c8ff42f9d7bafbed6daf293a11a354d..afa5f510e6e405884160925e1e2150ec3ee21677 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExternalDataValidatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExternalDataValidatorTest.java
@@ -22,6 +22,7 @@ import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationTestCa
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
 
 /**
@@ -33,7 +34,7 @@ public class ExternalDataValidatorTest extends AuthorizationTestCase
     {
         DataSet data = new DataSet();
         data.setExperiment(ExperimentTranslator.translate(createExperiment(group),
-                "http://someURL", null));
+                "http://someURL", null, new ManagedPropertyEvaluatorFactory(null, null)));
         return data;
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SampleValidatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SampleValidatorTest.java
index bebd79c83cba36e13164aae790dd99fcfa520a96..9ba3e2bb244dff3c08df4220fc16c8a65333b9d1 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SampleValidatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SampleValidatorTest.java
@@ -21,6 +21,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationTestCase;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator;
 
 /**
@@ -37,8 +38,9 @@ public class SampleValidatorTest extends AuthorizationTestCase
     {
         SampleValidator validator = new SampleValidator();
         PersonPE person = createPersonWithRoleAssignments();
-        assertEquals(true, validator.isValid(person,
-                SampleTranslator.translate(createSample(createAnotherSpace()), BASE_URL, null)));
+        assertEquals(true, validator.isValid(person, SampleTranslator.translate(
+                createSample(createAnotherSpace()), BASE_URL, null,
+                new ManagedPropertyEvaluatorFactory(null, null))));
     }
 
     @Test
@@ -46,8 +48,9 @@ public class SampleValidatorTest extends AuthorizationTestCase
     {
         SampleValidator validator = new SampleValidator();
         PersonPE person = createPersonWithRoleAssignments();
-        assertEquals(true, validator.isValid(person,
-                SampleTranslator.translate(createSample(createDatabaseInstance()), BASE_URL, null)));
+        assertEquals(true, validator.isValid(person, SampleTranslator.translate(
+                createSample(createDatabaseInstance()), BASE_URL, null,
+                new ManagedPropertyEvaluatorFactory(null, null))));
     }
 
     @Test
@@ -56,7 +59,8 @@ public class SampleValidatorTest extends AuthorizationTestCase
         SampleValidator validator = new SampleValidator();
         PersonPE person = createPersonWithRoleAssignments();
         assertEquals(false, validator.isValid(person, SampleTranslator.translate(
-                createSample(createDatabaseInstance("blabla")), BASE_URL, null)));
+                createSample(createDatabaseInstance("blabla")), BASE_URL, null,
+                new ManagedPropertyEvaluatorFactory(null, null))));
     }
 
     @Test
@@ -64,10 +68,9 @@ public class SampleValidatorTest extends AuthorizationTestCase
     {
         SampleValidator validator = new SampleValidator();
         PersonPE person = createPersonWithRoleAssignments();
-        assertEquals(
-                true,
-                validator.isValid(person,
-                        SampleTranslator.translate(createSample(createSpace()), BASE_URL, null)));
+        assertEquals(true, validator.isValid(person, SampleTranslator.translate(
+                createSample(createSpace()), BASE_URL, null, new ManagedPropertyEvaluatorFactory(
+                        null, null))));
     }
 
     @Test
@@ -76,9 +79,8 @@ public class SampleValidatorTest extends AuthorizationTestCase
         SampleValidator validator = new SampleValidator();
         PersonPE person = createPersonWithRoleAssignments();
         SpacePE group = createSpace("blabla", createAnotherDatabaseInstance());
-        assertEquals(
-                false,
-                validator.isValid(person,
-                        SampleTranslator.translate(createSample(group), BASE_URL, null)));
+        assertEquals(false, validator.isValid(person, SampleTranslator.translate(
+                createSample(group), BASE_URL, null,
+                new ManagedPropertyEvaluatorFactory(null, null))));
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/PropertiesBatchManagerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/PropertiesBatchManagerTest.java
index 8a5b48e0fbed36c947a87c82946c5ee46b158cdb..4ab286abe6846371e15e0397a9ee13b98ca8d76e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/PropertiesBatchManagerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/PropertiesBatchManagerTest.java
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.PropertyBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.builders.ExperimentTypePEBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.builders.SampleTypePEBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 
 /**
  * @author felmer
@@ -77,8 +78,8 @@ public class PropertiesBatchManagerTest extends AssertJUnit
         PropertyBuilder p5 = new PropertyBuilder(MANAGED_SUBCOLUMNS + ":2").value("12");
         addProperties(e2, p3, p4, p5);
 
-        new PropertiesBatchManager().manageProperties(builder.getExperimentTypePE(),
-                Arrays.asList(e1, e2), null);
+        new PropertiesBatchManager(new ManagedPropertyEvaluatorFactory(null, null))
+                .manageProperties(builder.getExperimentTypePE(), Arrays.asList(e1, e2), null);
 
         assertProperties("UN-MANAGED:hello, MANAGED-NO-SUBCOLUMNS:hi", e1);
         assertProperties("MANAGED-NO-SUBCOLUMNS-BUT-UPDATE:hi alpha, MANAGED_SUBCOLUMNS:ab12", e2);
@@ -99,8 +100,8 @@ public class PropertiesBatchManagerTest extends AssertJUnit
         PropertyBuilder p2 = new PropertyBuilder(MANAGED_ACCESS_OTHER_COLUMNS).value("ptr");
         addProperties(e1, p1, p2);
 
-        new PropertiesBatchManager().manageProperties(builder.getExperimentTypePE(),
-                Arrays.asList(e1), null);
+        new PropertiesBatchManager(new ManagedPropertyEvaluatorFactory(null, null))
+                .manageProperties(builder.getExperimentTypePE(), Arrays.asList(e1), null);
 
         assertProperties("UN-MANAGED:hello, MANAGED_ACCESS_OTHER_COLUMNS:hello ptr", e1);
     }
@@ -122,8 +123,8 @@ public class PropertiesBatchManagerTest extends AssertJUnit
 
         try
         {
-            new PropertiesBatchManager().manageProperties(builder.getSampleType(),
-                    Arrays.asList(s1, s2), null);
+            new PropertiesBatchManager(new ManagedPropertyEvaluatorFactory(null, null))
+                    .manageProperties(builder.getSampleType(), Arrays.asList(s1, s2), null);
         } catch (UserFailureException ufe)
         {
             assertEquals(
@@ -151,8 +152,8 @@ public class PropertiesBatchManagerTest extends AssertJUnit
 
         try
         {
-            new PropertiesBatchManager().manageProperties(builder.getExperimentTypePE(),
-                    Arrays.asList(e1), null);
+            new PropertiesBatchManager(new ManagedPropertyEvaluatorFactory(null, null))
+                    .manageProperties(builder.getExperimentTypePE(), Arrays.asList(e1), null);
             fail("UserFailureException expected");
         } catch (UserFailureException ex)
         {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBOTest.java
index 89a218b7192ec0016831452f3643002636880046..bc7487d3c48bacd15cb7351340f81342a2520e0b 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBOTest.java
@@ -61,6 +61,8 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IVocabularyDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IVocabularyTermDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.IPermIdDAO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 
 /**
  * An <i>abstract</i> test for <i>Business Object</i>.
@@ -142,6 +144,8 @@ public abstract class AbstractBOTest extends AssertJUnit
 
     protected IExternalDataManagementSystemDAO dataManagementSystemDAO;
 
+    protected IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     @BeforeMethod
     public void beforeMethod()
     {
@@ -181,6 +185,7 @@ public abstract class AbstractBOTest extends AssertJUnit
         sampleLister = context.mock(ISampleLister.class);
         datasetLister = context.mock(IDatasetLister.class);
         dataManagementSystemDAO = context.mock(IExternalDataManagementSystemDAO.class);
+        managedPropertyEvaluatorFactory = new ManagedPropertyEvaluatorFactory(null, null);
         context.checking(new Expectations()
             {
                 {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBOTest.java
index 8edf0c1898b1a0eb799c6036dce7516eeb929ac4..0ec0066fd0a2efe45c453807c4f73186f9843bf2 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AuthorizationGroupBOTest.java
@@ -50,7 +50,8 @@ public final class AuthorizationGroupBOTest extends AbstractBOTest
 
     private final AuthorizationGroupBO createBO()
     {
-        return new AuthorizationGroupBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, groupFactory);
+        return new AuthorizationGroupBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, groupFactory,
+                managedPropertyEvaluatorFactory);
     }
 
     @Test(expectedExceptions = AssertionError.class)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/CorePluginTableTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/CorePluginTableTest.java
index a14ab3e023aadf6067420b99646c13f823604f58..96e9545d21a4429a8f48e428b6f8472c4225435e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/CorePluginTableTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/CorePluginTableTest.java
@@ -59,7 +59,9 @@ public class CorePluginTableTest extends AbstractBOTest
         logRecorder = new BufferedAppender();
         scriptRunner = context.mock(IMasterDataScriptRegistrationRunner.class);
         pluginResourceLoader = context.mock(ICorePluginResourceLoader.class);
-        pluginTable = new CorePluginTable(daoFactory, EXAMPLE_SESSION, scriptRunner);
+        pluginTable =
+                new CorePluginTable(daoFactory, EXAMPLE_SESSION, scriptRunner,
+                        managedPropertyEvaluatorFactory);
         createdPluginsMatcher = new RecordingMatcher<List<CorePluginPE>>();
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBOTest.java
index 895fcadd8991903310e18c1c14999cddcddf2838..f09307bc8b2e8cb64c5ad3f586874fae56505a42 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBOTest.java
@@ -1160,7 +1160,7 @@ public class DataBOTest extends AbstractBOTest
     private final IDataBO createDataBO()
     {
         return new DataBO(daoFactory, EXAMPLE_SESSION, propertiesConverter, relationshipService,
-                conversationClient);
+                conversationClient, managedPropertyEvaluatorFactory);
     }
 
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTableTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTableTest.java
index b812296de4701a788ea6371b53ac0a6001014eaf..76a0f8f47749af95d7d21e3fe4ae647be1601171 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTableTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTableTest.java
@@ -99,7 +99,7 @@ public final class DataSetTableTest extends AbstractBOTest
     private final DataSetTable createDataSetTable()
     {
         return new DataSetTable(daoFactory, dssFactory, ManagerTestTool.EXAMPLE_SESSION,
-                relationshipService, conversationClient);
+                relationshipService, conversationClient, managedPropertyEvaluatorFactory);
     }
 
     @BeforeMethod
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypeBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypeBOTest.java
index 67b65b432adc3a9e762d1d814edb155354617c81..369d894fc4198cf72e44308c7d58584d223e43e8 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypeBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypeBOTest.java
@@ -39,7 +39,8 @@ public class EntityTypeBOTest extends AbstractBOTest
     public void testDeleteReferencedFromTrashCan()
     {
         final String sampleTypeCode = "SAMPLE_TYPE";
-        final IEntityTypeBO entityTypeBO = new EntityTypeBO(daoFactory, EXAMPLE_SESSION);
+        final IEntityTypeBO entityTypeBO =
+                new EntityTypeBO(daoFactory, EXAMPLE_SESSION, managedPropertyEvaluatorFactory);
         final EntityKind entityKind = EntityKind.SAMPLE;
         final SampleTypePE sampleType =
                 new SampleTypePEBuilder().id(1).code(sampleTypeCode).getSampleType();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBOTest.java
index 92594fedc50a8c7eafaa4e5bf9063860ae9c4aef..2148f7f536bb7bcfb010fbde33c2b5e100b8520c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBOTest.java
@@ -232,7 +232,7 @@ public final class EntityTypePropertyTypeBOTest extends AbstractBOTest
     private final EntityTypePropertyTypeBO createEntityTypePropertyTypeBO(EntityKind entityKind)
     {
         return new EntityTypePropertyTypeBO(daoFactory, EXAMPLE_SESSION, entityKind,
-                propertiesConverter);
+                propertiesConverter, managedPropertyEvaluatorFactory);
     }
 
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java
index 9e2c37758445a58fd5570b307f029e0085ec989f..10921387bfccbb4f2a4534160838f39be3dde02a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java
@@ -93,7 +93,8 @@ public final class ExperimentBOTest extends AbstractBOTest
 
     private final ExperimentBO createExperimentBO()
     {
-        return new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, relationshipService);
+        return new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, relationshipService,
+                managedPropertyEvaluatorFactory);
     }
 
     @BeforeMethod
@@ -451,7 +452,8 @@ public final class ExperimentBOTest extends AbstractBOTest
 
         prepareLoadExperimentByIdentifier(identifier, exp);
         ExperimentBO bo =
-                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter);
+                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter,
+                        managedPropertyEvaluatorFactory);
         bo.loadByExperimentIdentifier(identifier);
 
         ExperimentPE experiment = bo.getExperiment();
@@ -487,7 +489,8 @@ public final class ExperimentBOTest extends AbstractBOTest
                 Arrays.asList(materialProp, stringProp, termProp));
         prepareEntity(existingProperties, null);
         ExperimentBO bo =
-                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter);
+                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter,
+                        managedPropertyEvaluatorFactory);
 
         bo.updateProperties(entityType, newProperties, entityAsPropertiesHolder,
                 entityAsModifiableBean);
@@ -513,7 +516,8 @@ public final class ExperimentBOTest extends AbstractBOTest
                 Arrays.asList(stringProp2, materialProp2, termProp2));
         prepareEntity(existingProperties, null);
         ExperimentBO bo =
-                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter);
+                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter,
+                        managedPropertyEvaluatorFactory);
 
         bo.updateProperties(entityType, newProperties, entityAsPropertiesHolder,
                 entityAsModifiableBean);
@@ -540,7 +544,8 @@ public final class ExperimentBOTest extends AbstractBOTest
                 ManagerTestTool.EXAMPLE_SESSION.tryGetPerson(), newConvertedProperties);
         prepareEntity(existingProperties, newConvertedProperties);
         ExperimentBO bo =
-                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter);
+                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter,
+                        managedPropertyEvaluatorFactory);
 
         bo.updateProperties(entityType, newProperties, entityAsPropertiesHolder,
                 entityAsModifiableBean);
@@ -567,7 +572,8 @@ public final class ExperimentBOTest extends AbstractBOTest
                 ManagerTestTool.EXAMPLE_SESSION.tryGetPerson(), newConvertedProperties);
         prepareEntity(existingProperties, newConvertedProperties);
         ExperimentBO bo =
-                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter);
+                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter,
+                        managedPropertyEvaluatorFactory);
 
         bo.updateProperties(entityType, newProperties, entityAsPropertiesHolder,
                 entityAsModifiableBean);
@@ -595,7 +601,8 @@ public final class ExperimentBOTest extends AbstractBOTest
                 ManagerTestTool.EXAMPLE_SESSION.tryGetPerson(), newConvertedProperties);
         prepareEntity(existingProperties, newConvertedProperties);
         ExperimentBO bo =
-                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter);
+                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter,
+                        managedPropertyEvaluatorFactory);
 
         bo.updateProperties(entityType, newProperties, entityAsPropertiesHolder,
                 entityAsModifiableBean);
@@ -619,7 +626,8 @@ public final class ExperimentBOTest extends AbstractBOTest
                 ManagerTestTool.EXAMPLE_SESSION.tryGetPerson(), newConvertedProperties);
         prepareEntity(existingProperties, newConvertedProperties);
         ExperimentBO bo =
-                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter);
+                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter,
+                        managedPropertyEvaluatorFactory);
 
         bo.updateProperties(entityType, newProperties, entityAsPropertiesHolder,
                 entityAsModifiableBean);
@@ -643,7 +651,8 @@ public final class ExperimentBOTest extends AbstractBOTest
                 ManagerTestTool.EXAMPLE_SESSION.tryGetPerson(), newConvertedProperties);
         prepareEntity(existingProperties, newConvertedProperties);
         ExperimentBO bo =
-                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter);
+                new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter,
+                        managedPropertyEvaluatorFactory);
 
         bo.updateProperties(entityType, newProperties, entityAsPropertiesHolder,
                 entityAsModifiableBean);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTableTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTableTest.java
index e70c64439926d146e57bc31861d7beae397cadb7..a9ed39487b2d700f7e7fe1a5db5938a18146286d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTableTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTableTest.java
@@ -43,7 +43,8 @@ public final class ExperimentTableTest extends AbstractBOTest
 {
     private final ExperimentTable createExperimentTable()
     {
-        return new ExperimentTable(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter);
+        return new ExperimentTable(daoFactory, ManagerTestTool.EXAMPLE_SESSION,
+                propertiesConverter, managedPropertyEvaluatorFactory);
     }
 
     @Test
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomFilterBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomFilterBOTest.java
index 78e4af45abb120f79ae5cf5f2066fb552b65ba0e..1d94cdb55438fea095345f170e2e336d5d625ab0 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomFilterBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomFilterBOTest.java
@@ -95,7 +95,7 @@ public class GridCustomFilterBOTest extends AbstractBOTest
 
     private final IGridCustomFilterOrColumnBO createFilterBO()
     {
-        return new GridCustomFilterBO(daoFactory, EXAMPLE_SESSION);
+        return new GridCustomFilterBO(daoFactory, EXAMPLE_SESSION, managedPropertyEvaluatorFactory);
     }
 
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialTableTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialTableTest.java
index fa8a58a7047a9f6db10515a23dc163c5265a3a31..a223705b949393e075e2ab3c5c83c881ceb94c86 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialTableTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialTableTest.java
@@ -47,7 +47,7 @@ public final class MaterialTableTest extends AbstractBOTest
     private final MaterialTable createMaterialTable(List<MaterialPE> materials, boolean dataChanged)
     {
         return new MaterialTable(daoFactory, ManagerTestTool.EXAMPLE_SESSION, propertiesConverter,
-                materials, dataChanged);
+                materials, dataChanged, managedPropertyEvaluatorFactory);
     }
 
     private final MaterialTable createMaterialTable()
@@ -66,7 +66,7 @@ public final class MaterialTableTest extends AbstractBOTest
                 {
                     one(daoFactory).getHomeDatabaseInstance();
                     will(returnValue(CommonTestUtils.createHomeDatabaseInstance()));
-                    
+
                     one(daoFactory).setBatchUpdateMode(true);
                     one(daoFactory).setBatchUpdateMode(false);
                 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBOTest.java
index 83764692a58d637804d637881a74106419e0782b..3022a21ea363b52bd630500f8c619338d8ce3eb4 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBOTest.java
@@ -53,7 +53,8 @@ public final class ProjectBOTest extends AbstractBOTest
 
     private final ProjectBO createProjectBO()
     {
-        return new ProjectBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, relationshipService);
+        return new ProjectBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, relationshipService,
+                managedPropertyEvaluatorFactory);
     }
 
     @Test
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBOTest.java
index 782cd6e0056230a86d3055ae9cf4a2870aa4aaea..bbe29b592959572b8dae77f0553d625dc3b41945 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBOTest.java
@@ -53,7 +53,8 @@ public final class PropertyTypeBOTest extends AbstractBOTest
 
     private final PropertyTypeBO createPropertyTypeBO()
     {
-        return new PropertyTypeBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION);
+        return new PropertyTypeBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION,
+                managedPropertyEvaluatorFactory);
     }
 
     static final PropertyType createPropertyType(final DataTypeCode dataTypeCode)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTableTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTableTest.java
index f8f345919ce917ba8550ba1c3226ad26d0a3dc34..6771955d6f0f8da4c97db9af372f48a1beebbf27 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTableTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTableTest.java
@@ -40,7 +40,8 @@ public final class RoleAssignmentTableTest extends AbstractBOTest
 
     private final RoleAssignmentTable createRoleAssignmentTable()
     {
-        return new RoleAssignmentTable(daoFactory, ManagerTestTool.EXAMPLE_SESSION);
+        return new RoleAssignmentTable(daoFactory, ManagerTestTool.EXAMPLE_SESSION,
+                managedPropertyEvaluatorFactory);
     }
 
     @Test
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java
index 206781a7f7051350096ebc0b1fe4f610b0e88b6a..1006b2e030a0fd69adbfb24402411cc7b5e20dca 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java
@@ -1045,7 +1045,7 @@ public final class SampleBOTest extends AbstractBOTest
     private final SampleBO createSampleBO()
     {
         return new SampleBO(daoFactory, EXAMPLE_SESSION, propertiesConverter, relationshipService,
-                entityOperationChecker);
+                entityOperationChecker, managedPropertyEvaluatorFactory);
     }
 
     private SampleType createSampleType(final String sampleTypeCode)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTableTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTableTest.java
index ed847d85b51410312626453878cf431a2e6df8c1..3afc642f10af2b145643113099727ac6341c3f0d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTableTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTableTest.java
@@ -86,7 +86,8 @@ public final class SampleTableTest extends AbstractBOTest
 
     private final SampleTable createSampleTableBO()
     {
-        return new SampleTable(daoFactory, EXAMPLE_SESSION, null, entityOperationChecker);
+        return new SampleTable(daoFactory, EXAMPLE_SESSION, null, entityOperationChecker,
+                managedPropertyEvaluatorFactory);
     }
 
     private final static SampleIdentifier getSharedSampleIdentifier(final String code)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBOTest.java
index 94ae1ba83933776be01725df262aceca155ce8ed..ea45b12a2e9fb94e640693b76a5f9282e1ba4616 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ScriptBOTest.java
@@ -50,18 +50,18 @@ public final class ScriptBOTest extends AbstractBOTest
     {
         return new Object[][]
             {
-                    {
-                            ScriptType.DYNAMIC_PROPERTY,
-                            "Error evaluating '1+': SyntaxError: "
-                                    + "(\"no viable alternative at input ')'\", "
-                                    + "('expression: 1+', 1, 14, '__result__=(1+)\\n'))" },
-                    {
-                            ScriptType.MANAGED_PROPERTY,
-                            "SyntaxError: (\"no viable alternative at input '\\\\n\\\\n'\", "
-                                    + "('<string>', 1, 2, '1+\\n'))" }
-
-        };
-}
+                        {
+                                ScriptType.DYNAMIC_PROPERTY,
+                                "Error evaluating '1+': SyntaxError: "
+                                        + "(\"no viable alternative at input ')'\", "
+                                        + "('expression: 1+', 1, 14, '__result__=(1+)\\n'))" },
+                        {
+                                ScriptType.MANAGED_PROPERTY,
+                                "SyntaxError: (\"no viable alternative at input '\\\\n\\\\n'\", "
+                                        + "('<string>', 1, 2, '1+\\n'))" }
+
+            };
+    }
 
     private static final String SCRIPT = "1+1";
 
@@ -71,7 +71,8 @@ public final class ScriptBOTest extends AbstractBOTest
 
     private final ScriptBO createScriptBO()
     {
-        return new ScriptBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, scriptFactory);
+        return new ScriptBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, scriptFactory,
+                managedPropertyEvaluatorFactory);
     }
 
     @Test
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SpaceBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SpaceBOTest.java
index 3e6775ed177bc379cad77134c40e7c2d7260a339..a40a1c9d2be65fbde533c4fab4780b4530ba7e03 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SpaceBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SpaceBOTest.java
@@ -32,7 +32,8 @@ public final class SpaceBOTest extends AbstractBOTest
 {
     private final SpaceBO createSpaceBO()
     {
-        return new SpaceBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION);
+        return new SpaceBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION,
+                managedPropertyEvaluatorFactory);
     }
 
     @Test
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBOTest.java
index d2b6fdb120b8f99352a687d5bd95b7b10515364e..d06d5a78ff3b51cf40386b95185ba306c92bae60 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBOTest.java
@@ -64,7 +64,9 @@ public final class TrashBOTest extends AbstractBOTest
         super.beforeMethod();
         boFactory = context.mock(ICommonBusinessObjectFactory.class);
         dataSetTable = context.mock(IDataSetTable.class);
-        trashBO = new TrashBO(daoFactory, boFactory, ManagerTestTool.EXAMPLE_SESSION);
+        trashBO =
+                new TrashBO(daoFactory, boFactory, ManagerTestTool.EXAMPLE_SESSION,
+                        managedPropertyEvaluatorFactory);
         context.checking(new Expectations()
             {
                 {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBOTest.java
index 94fb3b26f402b933346ce174aa5774300614247f..b2097e376a8ba1bdd293e8c0c5a60b7330da2669 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBOTest.java
@@ -79,12 +79,13 @@ public final class VocabularyBOTest extends AbstractBOTest
 
     private final VocabularyBO createVocabularyBO()
     {
-        return new VocabularyBO(daoFactory, EXAMPLE_SESSION);
+        return new VocabularyBO(daoFactory, EXAMPLE_SESSION, managedPropertyEvaluatorFactory);
     }
 
     private final VocabularyBO createVocabularyBO(VocabularyPE vocabulary)
     {
-        return new VocabularyBO(daoFactory, EXAMPLE_SESSION, vocabulary);
+        return new VocabularyBO(daoFactory, EXAMPLE_SESSION, vocabulary,
+                managedPropertyEvaluatorFactory);
     }
 
     static final NewVocabulary createVocabulary()
@@ -331,8 +332,8 @@ public final class VocabularyBOTest extends AbstractBOTest
             vocabularyBO.addNewTerms(newTerms, 0L);
         } catch (UserFailureException e)
         {
-            assertEquals("Not allowed to add terms to an internally managed vocabulary.", e
-                    .getMessage());
+            assertEquals("Not allowed to add terms to an internally managed vocabulary.",
+                    e.getMessage());
         }
         context.assertIsSatisfied();
     }
@@ -354,12 +355,12 @@ public final class VocabularyBOTest extends AbstractBOTest
         vocabularyBO.load("voc-code");
         try
         {
-            vocabularyBO.delete(Collections.<VocabularyTerm> emptyList(), Collections
-                    .<VocabularyTermReplacement> emptyList());
+            vocabularyBO.delete(Collections.<VocabularyTerm> emptyList(),
+                    Collections.<VocabularyTermReplacement> emptyList());
         } catch (UserFailureException e)
         {
-            assertEquals("Not allowed to delete terms from an internally managed vocabulary.", e
-                    .getMessage());
+            assertEquals("Not allowed to delete terms from an internally managed vocabulary.",
+                    e.getMessage());
         }
         context.assertIsSatisfied();
     }
@@ -382,8 +383,8 @@ public final class VocabularyBOTest extends AbstractBOTest
         vocabularyBO.load("voc-code");
         try
         {
-            vocabularyBO.delete(Arrays.asList(term1), Collections
-                    .<VocabularyTermReplacement> emptyList());
+            vocabularyBO.delete(Arrays.asList(term1),
+                    Collections.<VocabularyTermReplacement> emptyList());
         } catch (IllegalArgumentException e)
         {
             assertEquals("Deletion of all 1 terms are not allowed.", e.getMessage());
@@ -415,8 +416,8 @@ public final class VocabularyBOTest extends AbstractBOTest
         vocabularyBO.load("voc-code");
         try
         {
-            vocabularyBO.delete(Arrays.asList(term1), Arrays.asList(createTermWithReplacement(
-                    term2, term1)));
+            vocabularyBO.delete(Arrays.asList(term1),
+                    Arrays.asList(createTermWithReplacement(term2, term1)));
             fail("IllegalArgumentException expected.");
         } catch (IllegalArgumentException e)
         {
@@ -447,8 +448,8 @@ public final class VocabularyBOTest extends AbstractBOTest
         vocabularyBO.load("voc-code");
         try
         {
-            vocabularyBO.delete(Collections.<VocabularyTerm> emptyList(), Arrays
-                    .asList(createTermWithReplacement(term1, term3)));
+            vocabularyBO.delete(Collections.<VocabularyTerm> emptyList(),
+                    Arrays.asList(createTermWithReplacement(term1, term3)));
             fail("IllegalArgumentException expected.");
         } catch (IllegalArgumentException e)
         {
@@ -476,8 +477,8 @@ public final class VocabularyBOTest extends AbstractBOTest
 
         VocabularyBO vocabularyBO = createVocabularyBO();
         vocabularyBO.load("voc-code");
-        vocabularyBO.delete(Arrays.asList(term1), Collections
-                .<VocabularyTermReplacement> emptyList());
+        vocabularyBO.delete(Arrays.asList(term1),
+                Collections.<VocabularyTermReplacement> emptyList());
 
         assertEquals(1, vocabulary.getTerms().size());
         context.assertIsSatisfied();
@@ -517,8 +518,8 @@ public final class VocabularyBOTest extends AbstractBOTest
 
         VocabularyBO vocabularyBO = createVocabularyBO();
         vocabularyBO.load("voc-code");
-        vocabularyBO.delete(Arrays.asList(term1), Arrays.asList(createTermWithReplacement(term2,
-                term3)));
+        vocabularyBO.delete(Arrays.asList(term1),
+                Arrays.asList(createTermWithReplacement(term2, term3)));
 
         assertEquals(term3.getCode(), entityPropertyPE.getVocabularyTerm().getCode());
         assertEquals(1, vocabulary.getTerms().size());
@@ -580,8 +581,9 @@ public final class VocabularyBOTest extends AbstractBOTest
         vocabulary.setTerms(Arrays.asList(createTermPE(RED, 1)));
         VocabularyBO bo = createVocabularyBO(vocabulary);
         VocabularyTermBatchUpdateDetails details = new VocabularyTermBatchUpdateDetails(true, true);
-        bo.updateTerms(convertToUpdatedTerms(Arrays.asList(createTerm(RED, 1),
-                createTerm(WHITE, 2), createTerm(YELLOW, 3)), details));
+        bo.updateTerms(convertToUpdatedTerms(
+                Arrays.asList(createTerm(RED, 1), createTerm(WHITE, 2), createTerm(YELLOW, 3)),
+                details));
         List<VocabularyTermPE> sorted = sortByOrdinal(bo.getVocabulary().getTerms());
 
         assertEquals(RED, sorted.get(0).getCode());
@@ -598,8 +600,9 @@ public final class VocabularyBOTest extends AbstractBOTest
                 createTermPE(YELLOW, 3)));
         VocabularyBO bo = createVocabularyBO(vocabulary);
         VocabularyTermBatchUpdateDetails details = new VocabularyTermBatchUpdateDetails(true, true);
-        bo.updateTerms(convertToUpdatedTerms(Arrays.asList(createTerm(WHITE, 1), createTerm(YELLOW,
-                2), createTerm(RED, 3)), details));
+        bo.updateTerms(convertToUpdatedTerms(
+                Arrays.asList(createTerm(WHITE, 1), createTerm(YELLOW, 2), createTerm(RED, 3)),
+                details));
         List<VocabularyTermPE> sorted = sortByOrdinal(bo.getVocabulary().getTerms());
 
         assertEquals(WHITE, sorted.get(0).getCode());
@@ -613,13 +616,15 @@ public final class VocabularyBOTest extends AbstractBOTest
         // change label but leave description untouched
         VocabularyPE vocabulary = new VocabularyPE();
         vocabulary.setManagedInternally(false);
-        vocabulary.setTerms(Arrays.asList(createTermPEWithLabelAndDescription(RED, LABEL_A, DESC_A,
-                1), createTermPEWithLabelAndDescription(WHITE, LABEL_B, DESC_B, 2)));
+        vocabulary.setTerms(Arrays.asList(
+                createTermPEWithLabelAndDescription(RED, LABEL_A, DESC_A, 1),
+                createTermPEWithLabelAndDescription(WHITE, LABEL_B, DESC_B, 2)));
         VocabularyBO bo = createVocabularyBO(vocabulary);
         VocabularyTermBatchUpdateDetails details =
                 new VocabularyTermBatchUpdateDetails(true, false);
-        bo.updateTerms(convertToUpdatedTerms(Arrays.asList(createTermWithLabel(RED, LABEL_C, 1),
-                createTermWithLabel(WHITE, LABEL_D, 2)), details));
+        bo.updateTerms(convertToUpdatedTerms(
+                Arrays.asList(createTermWithLabel(RED, LABEL_C, 1),
+                        createTermWithLabel(WHITE, LABEL_D, 2)), details));
         List<VocabularyTermPE> sorted = sortByOrdinal(bo.getVocabulary().getTerms());
 
         assertEquals(RED, sorted.get(0).getCode());
@@ -637,14 +642,15 @@ public final class VocabularyBOTest extends AbstractBOTest
         // change description but leave label untouched
         VocabularyPE vocabulary = new VocabularyPE();
         vocabulary.setManagedInternally(false);
-        vocabulary.setTerms(Arrays.asList(createTermPEWithLabelAndDescription(RED, LABEL_A, DESC_A,
-                1), createTermPEWithLabelAndDescription(WHITE, LABEL_B, DESC_B, 2)));
+        vocabulary.setTerms(Arrays.asList(
+                createTermPEWithLabelAndDescription(RED, LABEL_A, DESC_A, 1),
+                createTermPEWithLabelAndDescription(WHITE, LABEL_B, DESC_B, 2)));
         VocabularyBO bo = createVocabularyBO(vocabulary);
         VocabularyTermBatchUpdateDetails details =
                 new VocabularyTermBatchUpdateDetails(false, true);
-        bo.updateTerms(convertToUpdatedTerms(Arrays.asList(
-                createTermWithDescription(RED, DESC_C, 1), createTermWithDescription(WHITE, DESC_D,
-                        2)), details));
+        bo.updateTerms(convertToUpdatedTerms(
+                Arrays.asList(createTermWithDescription(RED, DESC_C, 1),
+                        createTermWithDescription(WHITE, DESC_D, 2)), details));
         List<VocabularyTermPE> sorted = sortByOrdinal(bo.getVocabulary().getTerms());
 
         assertEquals(RED, sorted.get(0).getCode());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
index ad91293d8f3b2b065126102631aa3da56da616c0..219a13c9e368c7d0297f97fed27ea2f3b99660d1 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
@@ -56,6 +56,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetShareId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator;
 
 /**
@@ -144,7 +145,8 @@ public class DatasetListerTest extends AbstractDAOTest
                 new HashSet<String>(Arrays.asList("200902091250077-1026", "200902091225616-1027"));
         List<SamplePE> samplePEs = daoFactory.getSampleDAO().listByPermID(samplePermIDs);
         List<Sample> samples =
-                SampleTranslator.translate(samplePEs, "", new HashMap<Long, Set<Metaproject>>());
+                SampleTranslator.translate(samplePEs, "", new HashMap<Long, Set<Metaproject>>(),
+                        new ManagedPropertyEvaluatorFactory(null, null));
 
         Map<Sample, List<ExternalData>> dataSets = lister.listAllDataSetsFor(samples);
 
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 23acf350c492f07d1ca6c27ef27ba10ae63e516c..c7a347983aff829f3643690b100e7589ab91cd73 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
@@ -87,7 +87,7 @@ public final class EntityPropertiesConverterTest extends AbstractBOTest
             final EntityKind entityKind)
     {
         return new EntityPropertiesConverter(entityKind, daoFactory, propertyValueValidator,
-                placeholderCreator);
+                placeholderCreator, managedPropertyEvaluatorFactory);
     }
 
     private void prepareForConvertion(final Expectations exp)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOWithoutContextTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOWithoutContextTest.java
index bcf6fd4f47807e2a9ac1df273fd7ad182a17a486..a882eb21858f2ec281298cb7574c7aae4885a15c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOWithoutContextTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOWithoutContextTest.java
@@ -46,6 +46,7 @@ import ch.systemsx.cisd.openbis.generic.server.util.TestInitializer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AuthorizationGroupPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Code;
@@ -248,6 +249,7 @@ public abstract class AbstractDAOWithoutContextTest extends
         result.setDatabaseInstance(daoFactory.getHomeDatabaseInstance());
         result.setRegistrator(getSystemPerson());
         result.setEntityKind(kind);
+        result.setPluginType(PluginType.JYTHON);
         return result;
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorDbTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorDbTest.java
index 0b0a7cbe3ad98680c4f8eda2688cdf480cdb077e..0ee495af365e7586b2750d0411871430f18cd24b 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorDbTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorDbTest.java
@@ -20,7 +20,8 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.AbstractDAOTest;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.DynamicPropertyEvaluator;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.DynamicPropertyCalculatorFactory;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 
 /**
  * @author Piotr Buczek
@@ -34,7 +35,9 @@ public class DynamicPropertyEvaluatorDbTest extends AbstractDAOTest
     @BeforeMethod
     public void beforeClass() throws Exception
     {
-        evaluator = new DynamicPropertyEvaluator(daoFactory, null);
+        evaluator =
+                new DynamicPropertyEvaluator(daoFactory, null,
+                        new DynamicPropertyCalculatorFactory(null, null),
+                        new ManagedPropertyEvaluatorFactory(null, null));
     }
-
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorTest.java
index be713d1acde656e8a415ececf53e5b5b65c82540..f87e856d6ff9e9d3281cec186482208d46a125b2 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorTest.java
@@ -33,6 +33,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.AbstractBOTest;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.EntityPropertiesConverter.IHibernateSessionProvider;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.AbstractEntityAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.BasicPropertyAdaptor;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.DynamicPropertyCalculatorFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityPropertyAdaptor;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
@@ -76,7 +77,10 @@ public class DynamicPropertyEvaluatorTest extends AbstractBOTest
                     return session;
                 }
             };
-        evaluator = new DynamicPropertyEvaluator(daoFactory, sessionProvider);
+        evaluator =
+                new DynamicPropertyEvaluator(daoFactory, sessionProvider,
+                        new DynamicPropertyCalculatorFactory(null, null),
+                        managedPropertyEvaluatorFactory);
     }
 
     @Test
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/JythonManagedPropertyEvaluatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/JythonManagedPropertyEvaluatorTest.java
index b66b0c3085db338534f9ffd4512a27545d5fe599..9bc6e4b70e0b8bada6d38ec74b6cfb88a143aa84 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/JythonManagedPropertyEvaluatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/JythonManagedPropertyEvaluatorTest.java
@@ -24,6 +24,7 @@ import org.testng.AssertJUnit;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.jython.evaluator.EvaluatorException;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.BasicPropertyAdaptor;
 import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ManagedComboBoxInputWidgetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ManagedHtmlWidgetDescription;
@@ -91,7 +92,8 @@ public class JythonManagedPropertyEvaluatorTest extends AssertJUnit
                 CommonTestUtils.getResourceAsString(SCRIPT_FOLDER, CONFIGURE_UI_OUTPUT_TEST_PY);
         JythonManagedPropertyEvaluator evaluator = new JythonManagedPropertyEvaluator(script);
 
-        evaluator.configureUI(managedProperty, new SamplePropertyPE());
+        evaluator.configureUI(managedProperty, new BasicPropertyAdaptor("CODE", "value",
+                new SamplePropertyPE()));
         assertEquals(true, managedProperty.isOwnTab());
         IManagedOutputWidgetDescription outputWidgetDescripion =
                 managedProperty.getUiDescription().getOutputWidgetDescription();
@@ -149,7 +151,8 @@ public class JythonManagedPropertyEvaluatorTest extends AssertJUnit
                         .getResourceAsString(SCRIPT_FOLDER, CONFIGURE_UI_OUTPUT_HTML_TEST_PY);
         JythonManagedPropertyEvaluator evaluator = new JythonManagedPropertyEvaluator(script);
 
-        evaluator.configureUI(managedProperty, new SamplePropertyPE());
+        evaluator.configureUI(managedProperty, new BasicPropertyAdaptor("CODE", "value",
+                new SamplePropertyPE()));
         assertEquals(true, managedProperty.isOwnTab());
         IManagedOutputWidgetDescription outputWidgetDescripion =
                 managedProperty.getUiDescription().getOutputWidgetDescription();
@@ -179,7 +182,8 @@ public class JythonManagedPropertyEvaluatorTest extends AssertJUnit
                 CommonTestUtils.getResourceAsString(SCRIPT_FOLDER, CONFIGURE_UI_INPUT_TEST_PY);
         JythonManagedPropertyEvaluator evaluator = new JythonManagedPropertyEvaluator(script);
 
-        evaluator.configureUI(managedProperty, new SamplePropertyPE());
+        evaluator.configureUI(managedProperty, new BasicPropertyAdaptor("CODE", "value",
+                new SamplePropertyPE()));
         assertEquals(false, managedProperty.isOwnTab());
 
         List<IManagedUiAction> actions = managedProperty.getUiDescription().getActions();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/StructuredPropertyConverterPythonTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/StructuredPropertyConverterPythonTest.java
index 313c128bc33ea66ef7bc99fb270228426588233b..1557c0c11253a0a4f97b08a8d732181fcb20c86a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/StructuredPropertyConverterPythonTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/managed_property/structured/StructuredPropertyConverterPythonTest.java
@@ -21,6 +21,7 @@ import java.util.List;
 import org.testng.AssertJUnit;
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.BasicPropertyAdaptor;
 import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ManagedEntityProperty;
@@ -50,7 +51,8 @@ public class StructuredPropertyConverterPythonTest extends AssertJUnit
                 CommonTestUtils.getResourceAsString(SCRIPT_FOLDER, "structured-property-test.py");
         JythonManagedPropertyEvaluator evaluator = new JythonManagedPropertyEvaluator(script);
 
-        evaluator.configureUI(managedProperty, new SamplePropertyPE());
+        evaluator.configureUI(managedProperty, new BasicPropertyAdaptor("CODE", "value",
+                new SamplePropertyPE()));
 
         // the script will create several elements and serialize them in the property value
         List<IElement> elements =
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslatorTest.java
index eeb161f5d90b05cccc972a939c75522bf53ea630..e3e7d7a1ad31f04fcd20979c0988f4388304c6b4 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslatorTest.java
@@ -48,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 
 /**
  * @author Franz-Josef Elmer
@@ -64,7 +65,9 @@ public class DataSetTranslatorTest extends AssertJUnit
     {
         ExternalDataPE externalDataPE = new ExternalDataPE();
         externalDataPE.setDataStore(createStore());
-        ExternalData data = DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null);
+        ExternalData data =
+                DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null,
+                        new ManagedPropertyEvaluatorFactory(null, null));
 
         DataSet translated = data.tryGetAsDataSet();
 
@@ -129,7 +132,9 @@ public class DataSetTranslatorTest extends AssertJUnit
         deletionPE.setRegistrator(personPE);
         externalDataPE.setDeletion(deletionPE);
         externalDataPE.setSampleAcquiredFrom(samplePE);
-        ExternalData data = DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null);
+        ExternalData data =
+                DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null,
+                        new ManagedPropertyEvaluatorFactory(null, null));
 
         DataSet translated = data.tryGetAsDataSet();
 
@@ -186,7 +191,8 @@ public class DataSetTranslatorTest extends AssertJUnit
         externalDataPE.addParentRelationship(createParentRelationship(externalDataPE, "parent-2"));
 
         ExternalData externalData =
-                DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null);
+                DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null,
+                        new ManagedPropertyEvaluatorFactory(null, null));
 
         assertEquals("my-experiment", externalData.getExperiment().getCode());
         assertEquals(2, externalData.getParents().size());
@@ -228,7 +234,9 @@ public class DataSetTranslatorTest extends AssertJUnit
         linkDataPE.addParentRelationship(createParentRelationship(linkDataPE, "parent-1"));
         linkDataPE.addParentRelationship(createParentRelationship(linkDataPE, "parent-2"));
 
-        ExternalData externalData = DataSetTranslator.translate(linkDataPE, BASE_INDEX_URL, null);
+        ExternalData externalData =
+                DataSetTranslator.translate(linkDataPE, BASE_INDEX_URL, null,
+                        new ManagedPropertyEvaluatorFactory(null, null));
 
         assertEquals("my-experiment", externalData.getExperiment().getCode());
         assertEquals(2, externalData.getParents().size());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/BatchMaterialRegistrationAndUpdateTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/BatchMaterialRegistrationAndUpdateTest.java
index 5260a073087636fd2ceb3f00a371a452d20923c9..ebe26ec25ff0c10683e47ad4aa0cd512a5cc6c7b 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/BatchMaterialRegistrationAndUpdateTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/BatchMaterialRegistrationAndUpdateTest.java
@@ -48,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
@@ -76,6 +77,7 @@ public class BatchMaterialRegistrationAndUpdateTest extends SystemTestCase
         deleteTestMaterials();
         Script script = new Script();
         script.setScriptType(ScriptType.MANAGED_PROPERTY);
+        script.setPluginType(PluginType.JYTHON);
         script.setName("batch script");
         script.setScript("def batchColumnNames():\n  return ['A', 'B']\n"
                 + "def updateFromBatchInput(bindings):\n"
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTest.java
index 62d080b2f1d34bd1419148718f24d1494f0eef2e..0eb5a87c07525c8f3a04fd6b276ff2a9e711863b 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTest.java
@@ -29,6 +29,7 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityValidationEvaluationInfo;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PluginType;
 import ch.systemsx.cisd.openbis.systemtest.SystemTestCase;
 
 /**
@@ -176,7 +177,8 @@ public class CommonServerTest extends SystemTestCase
                         + getResourceAsString(scriptName);
 
         EntityValidationEvaluationInfo info =
-                new EntityValidationEvaluationInfo(entityKind, entityIdentifier, false, script);
+                new EntityValidationEvaluationInfo(entityKind, entityIdentifier, false,
+                        PluginType.JYTHON, "common_adaptor_test.py", script);
 
         String result = commonServer.evaluate(sessionToken, info);
         Assert.assertEquals("Validation OK", result);
diff --git a/openbis/sourceTest/sql/postgresql/130/020=database_version_logs.tsv b/openbis/sourceTest/sql/postgresql/130/020=database_version_logs.tsv
index 5362a9587e89b73a44b178eef1978fe5f4ea607e..e5fc954a97c4ccc10f1699ce15f13d0d97a9a027 100644
--- a/openbis/sourceTest/sql/postgresql/130/020=database_version_logs.tsv
+++ b/openbis/sourceTest/sql/postgresql/130/020=database_version_logs.tsv
@@ -103,4 +103,4 @@
 127	source/sql/postgresql/migration/migration-126-127.sql	SUCCESS	2012-11-26 11:01:56.585	\\x2d2d204d6967726174696f6e2066726f6d2031323620746f203132370a0a75706461746520646174615f616c6c207365742076657273696f6e203d20302077686572652076657273696f6e206973206e756c6c3b0a	\N
 128	source/sql/postgresql/migration/migration-127-128.sql	SUCCESS	2012-12-12 08:55:54.095	\\x2d2d204d6967726174696f6e2066726f6d2031323720746f203132380a0a414c544552205441424c4520444154415f53544f5245532041444420434f4c554d4e20444154415f534f555243455f444546494e4954494f4e5320544558545f56414c55453b0a	\N
 129	source/sql/postgresql/migration/migration-128-129.sql	SUCCESS	2013-01-08 12:28:49.271	\\x2d2d204d6967726174696f6e2066726f6d2031323820746f203132390a0a43524541544520494e44455820455852454c485f53414d505f49445f464b5f49204f4e204558504552494d454e545f52454c4154494f4e53484950535f484953544f5259202853414d505f4944293b0a43524541544520494e44455820455852454c485f444154415f49445f464b5f49204f4e204558504552494d454e545f52454c4154494f4e53484950535f484953544f52592028444154415f4944293b0a43524541544520494e4445582053414d5052454c485f53414d505f49445f464b5f49204f4e2053414d504c455f52454c4154494f4e53484950535f484953544f5259202853414d505f4944293b0a43524541544520494e4445582053414d5052454c485f444154415f49445f464b5f49204f4e2053414d504c455f52454c4154494f4e53484950535f484953544f52592028444154415f4944293b0a43524541544520494e444558204441544152454c485f444154415f464b5f49204f4e20444154415f5345545f52454c4154494f4e53484950535f484953544f52592028444154415f4944293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f70726f706572746965735f64656c6574652041530a202020204f4e2044454c45544520544f2073616d706c655f70726f70657274696573200a2020202057484552452028284f4c442e56414c5545204953204e4f54204e554c4c20414e44206465636f646528737562737472696e67284f4c442e76616c75652066726f6d203120666f722031292c2027657363617065272920213d2045275c5c7865666266626427290a20202020202020204f52204f4c442e435654455f4944204953204e4f54204e554c4c200a20202020202020204f52204f4c442e4d4154455f50524f505f4944204953204e4f54204e554c4c290a09202020414e44202853454c4543542044454c5f49442046524f4d2053414d504c45535f414c4c205748455245204944203d204f4c442e53414d505f494429204953204e554c4c0a2020202020444f20414c534f0a20202020202020494e5345525420494e544f2073616d706c655f70726f706572746965735f686973746f727920280a20202020202020202049442c200a20202020202020202053414d505f49442c0a202020202020202020535450545f49442c200a20202020202020202056414c55452c200a202020202020202020564f434142554c4152595f5445524d2c0a2020202020202020204d4154455249414c2c200a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d502c0a20202020202020202056414c49445f554e54494c5f54494d455354414d50200a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f50524f50455254595f49445f53455127292c200a2020202020202020204f4c442e53414d505f49442c200a2020202020202020204f4c442e535450545f49442c200a2020202020202020204f4c442e56414c55452c200a2020202020202020202873656c6563742028742e636f6465207c7c2027205b27207c7c20762e636f6465207c7c20275d27292066726f6d20636f6e74726f6c6c65645f766f636162756c6172795f7465726d732061732074206a6f696e20636f6e74726f6c6c65645f766f636162756c61726965732061732076206f6e20742e636f766f5f6964203d20762e696420776865726520742e6964203d204f4c442e435654455f4944292c0a2020202020202020202873656c65637420286d2e636f6465207c7c2027205b27207c7c206d742e636f6465207c7c20275d27292066726f6d206d6174657269616c73206173206d206a6f696e206d6174657269616c5f7479706573206173206d74206f6e206d2e6d6174795f6964203d206d742e6964207768657265206d2e6964203d204f4c442e4d4154455f50524f505f4944292c0a2020202020202020204f4c442e504552535f49445f415554484f522c0a2020202020202020204f4c442e4d4f44494649434154494f4e5f54494d455354414d502c0a20202020202020202063757272656e745f74696d657374616d700a20202020202020293b0a202020202020200a435245415445204f52205245504c4143452052554c4520646174615f7365745f70726f706572746965735f64656c6574652041530a202020204f4e2044454c45544520544f20646174615f7365745f70726f70657274696573200a2020202057484552452028284f4c442e56414c5545204953204e4f54204e554c4c20414e44206465636f646528737562737472696e67284f4c442e76616c75652066726f6d203120666f722031292c2027657363617065272920213d2045275c5c7865666266626427290a20202020202020204f52204f4c442e435654455f4944204953204e4f54204e554c4c200a20202020202020204f52204f4c442e4d4154455f50524f505f4944204953204e4f54204e554c4c290a09202020414e44202853454c4543542044454c5f49442046524f4d20444154415f414c4c205748455245204944203d204f4c442e44535f494429204953204e554c4c0a20202020444f20414c534f0a20202020202020494e5345525420494e544f20646174615f7365745f70726f706572746965735f686973746f727920280a20202020202020202049442c200a20202020202020202044535f49442c0a20202020202020202044535450545f49442c200a20202020202020202056414c55452c200a202020202020202020564f434142554c4152595f5445524d2c0a2020202020202020204d4154455249414c2c200a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d502c0a20202020202020202056414c49445f554e54494c5f54494d455354414d50200a20202020202020292056414c55455320280a2020202020202020206e65787476616c2827444154415f5345545f50524f50455254595f49445f53455127292c200a2020202020202020204f4c442e44535f49442c200a2020202020202020204f4c442e44535450545f49442c200a2020202020202020204f4c442e56414c55452c200a2020202020202020202873656c6563742028742e636f6465207c7c2027205b27207c7c20762e636f6465207c7c20275d27292066726f6d20636f6e74726f6c6c65645f766f636162756c6172795f7465726d732061732074206a6f696e20636f6e74726f6c6c65645f766f636162756c61726965732061732076206f6e20742e636f766f5f6964203d20762e696420776865726520742e6964203d204f4c442e435654455f4944292c0a2020202020202020202873656c65637420286d2e636f6465207c7c2027205b27207c7c206d742e636f6465207c7c20275d27292066726f6d206d6174657269616c73206173206d206a6f696e206d6174657269616c5f7479706573206173206d74206f6e206d2e6d6174795f6964203d206d742e6964207768657265206d2e6964203d204f4c442e4d4154455f50524f505f4944292c0a2020202020202020204f4c442e504552535f49445f415554484f522c0a2020202020202020204f4c442e4d4f44494649434154494f4e5f54494d455354414d502c0a20202020202020202063757272656e745f74696d657374616d700a20202020202020293b0a	\N
-130	source/sql/postgresql/migration/migration-129-130.sql	SUCCESS	2013-02-08 13:54:30.03	\\x2d2d204d6967726174696f6e2066726f6d2031323920746f203133300a0a616c746572207461626c6520706f73745f726567697374726174696f6e5f646174617365745f71756575652064726f7020434f4e53545241494e5420707264715f64735f666b3b0a616c746572207461626c6520706f73745f726567697374726174696f6e5f646174617365745f71756575652061646420434f4e53545241494e5420707264715f64735f666b20464f524549474e204b4559202864735f696429205245464552454e43455320646174615f616c6c2028696429204f4e2044454c45544520434153434144453b0a	\N
+130	source/sql/postgresql/migration/migration-129-130.sql	SUCCESS	2013-02-12 16:57:29.437	\\x2d2d204d6967726174696f6e2066726f6d2031323920746f203133300a0a43524541544520444f4d41494e20504c5547494e5f5459504520415320564152434841522834302920434845434b202856414c554520494e2028274a5954484f4e272c20275052454445504c4f5945442729293b0a0a414c544552205441424c4520534352495054532041444420434f4c554d4e20504c5547494e5f5459504520504c5547494e5f54595045204e4f54204e554c4c2044454641554c5420274a5954484f4e273b0a414c544552205441424c45205343524950545320414c54455220434f4c554d4e205343524950542044524f50204e4f54204e554c4c3b0a414c544552205441424c4520534352495054532041444420434f4e53545241494e54205343524950545f4e4e5f434b20434845434b0a202028504c5547494e5f54595045203d20275052454445504c4f59454427204f5220534352495054204953204e4f54204e554c4c293b0a20200a616c746572207461626c6520706f73745f726567697374726174696f6e5f646174617365745f71756575652064726f7020434f4e53545241494e5420707264715f64735f666b3b0a616c746572207461626c6520706f73745f726567697374726174696f6e5f646174617365745f71756575652061646420434f4e53545241494e5420707264715f64735f666b20464f524549474e204b4559202864735f696429205245464552454e43455320646174615f616c6c2028696429204f4e2044454c45544520434153434144453b0a20200a	\N
diff --git a/openbis/sourceTest/sql/postgresql/130/059=scripts.tsv b/openbis/sourceTest/sql/postgresql/130/059=scripts.tsv
index f39b7de2db43d2eea09aa9df8d7384ea2b086ef0..96742056a53aee1a3f225c900d2ee70454c45226 100644
--- a/openbis/sourceTest/sql/postgresql/130/059=scripts.tsv
+++ b/openbis/sourceTest/sql/postgresql/130/059=scripts.tsv
@@ -1,11 +1,11 @@
-1	1	properties	number of properties	str(entity.properties().size()) + ' properties'	2010-10-27 15:16:48.994831+02	2	\N	DYNAMIC_PROPERTY
-2	1	code	\N	entity.code()	2010-10-27 15:16:48.994831+02	2	\N	DYNAMIC_PROPERTY
-3	1	date	\N	str(currentDate().getTime())	2010-10-27 15:16:48.994831+02	2	\N	DYNAMIC_PROPERTY
-4	1	managed list	\N	fake script	2010-10-27 15:16:48.994831+02	2	\N	MANAGED_PROPERTY
-5	1	validateOK	\N	def validate(entity, isNew):\n  pass\n 	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION
-6	1	validateFAIL	\N	def validate(entity, isNew):\n  return "This check always fail"\n 	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION
-7	1	validateUpdateFAIL	\N	def validate(entity, isNew):\n  if (not isNew):\n    return "Cannot update this entity"\n 	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION
-8	1	validateChildren	\N	def validate(entity, isNew):\n  for child in entity.children():\n    requestValidation(child)	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION
-9	1	code_date	\N	"%s %s" % (entity.code(), str(currentDate().getTime()))	2010-10-27 15:16:48.994831+02	2	\N	DYNAMIC_PROPERTY
-10	1	waitOK	\N	import time;\ndef validate(entity, isNew):\n  time.sleep(1);\n 	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION
-11	1	test	\N	import time;\ndef validate(entity, isNew):\n  pass\n 	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION
+1	1	properties	number of properties	str(entity.properties().size()) + ' properties'	2010-10-27 15:16:48.994831+02	2	\N	DYNAMIC_PROPERTY	JYTHON
+2	1	code	\N	entity.code()	2010-10-27 15:16:48.994831+02	2	\N	DYNAMIC_PROPERTY	JYTHON
+3	1	date	\N	str(currentDate().getTime())	2010-10-27 15:16:48.994831+02	2	\N	DYNAMIC_PROPERTY	JYTHON
+4	1	managed list	\N	fake script	2010-10-27 15:16:48.994831+02	2	\N	MANAGED_PROPERTY	JYTHON
+5	1	validateOK	\N	def validate(entity, isNew):\n  pass\n 	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION	JYTHON
+6	1	validateFAIL	\N	def validate(entity, isNew):\n  return "This check always fail"\n 	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION	JYTHON
+7	1	validateUpdateFAIL	\N	def validate(entity, isNew):\n  if (not isNew):\n    return "Cannot update this entity"\n 	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION	JYTHON
+8	1	validateChildren	\N	def validate(entity, isNew):\n  for child in entity.children():\n    requestValidation(child)	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION	JYTHON
+9	1	code_date	\N	"%s %s" % (entity.code(), str(currentDate().getTime()))	2010-10-27 15:16:48.994831+02	2	\N	DYNAMIC_PROPERTY	JYTHON
+10	1	waitOK	\N	import time;\ndef validate(entity, isNew):\n  time.sleep(1);\n 	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION	JYTHON
+11	1	test	\N	import time;\ndef validate(entity, isNew):\n  pass\n 	2010-10-27 15:16:48.994831+02	2	\N	ENTITY_VALIDATION	JYTHON
diff --git a/openbis/sourceTest/sql/postgresql/130/schema-130.sql b/openbis/sourceTest/sql/postgresql/130/schema-130.sql
index ad2c09c97e4e62aacecdb170fbe2f2555eaab470..ddc4256c83a64332d4c3381dde2f222c353a09f8 100644
--- a/openbis/sourceTest/sql/postgresql/130/schema-130.sql
+++ b/openbis/sourceTest/sql/postgresql/130/schema-130.sql
@@ -1,7 +1,8 @@
 SET statement_timeout = 0;
-SET standard_conforming_strings = on;
+SET standard_conforming_strings = off;
 SET check_function_bodies = false;
 SET client_min_messages = warning;
+SET escape_string_warning = off;
 SET search_path = public, pg_catalog;
 CREATE DOMAIN archiving_status AS character varying(100)
 	CONSTRAINT archiving_status_check CHECK (((VALUE)::text = ANY (ARRAY[('LOCKED'::character varying)::text, ('AVAILABLE'::character varying)::text, ('ARCHIVED'::character varying)::text, ('ARCHIVE_PENDING'::character varying)::text, ('UNARCHIVE_PENDING'::character varying)::text, ('BACKUP_PENDING'::character varying)::text])));
@@ -31,6 +32,8 @@ CREATE DOMAIN identifier AS character varying(200);
 CREATE DOMAIN object_name AS character varying(50);
 CREATE DOMAIN ordinal_int AS bigint
 	CONSTRAINT ordinal_int_check CHECK ((VALUE > 0));
+CREATE DOMAIN plugin_type AS character varying(40)
+	CONSTRAINT plugin_type_check CHECK (((VALUE)::text = ANY ((ARRAY['JYTHON'::character varying, 'PREDEPLOYED'::character varying])::text[])));
 CREATE DOMAIN query_type AS character varying(40)
 	CONSTRAINT query_type_check CHECK (((VALUE)::text = ANY (ARRAY[('GENERIC'::character varying)::text, ('EXPERIMENT'::character varying)::text, ('SAMPLE'::character varying)::text, ('DATA_SET'::character varying)::text, ('MATERIAL'::character varying)::text])));
 CREATE DOMAIN real_value AS real;
@@ -1426,11 +1429,13 @@ CREATE TABLE scripts (
     dbin_id tech_id NOT NULL,
     name character varying(200) NOT NULL,
     description description_2000,
-    script text_value NOT NULL,
+    script text_value,
     registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
     pers_id_registerer tech_id NOT NULL,
     entity_kind entity_kind,
-    script_type script_type NOT NULL
+    script_type script_type NOT NULL,
+    plugin_type plugin_type DEFAULT 'JYTHON'::character varying NOT NULL,
+    CONSTRAINT script_nn_ck CHECK ((((plugin_type)::text = 'PREDEPLOYED'::text) OR (script IS NOT NULL)))
 );
 CREATE SEQUENCE space_id_seq
     START WITH 1
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java
index 9ed2eb43d33a5439c049ebc832b0efa4e0209877..5c2a82ec67848cd2cbe9315de1178748bb09329c 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java
@@ -61,6 +61,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MetaprojectTranslator;
@@ -94,26 +95,32 @@ public class ProteomicsDataServiceInternal extends AbstractServer<IProteomicsDat
 
     private IBusinessObjectFactory boFactory;
 
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     public ProteomicsDataServiceInternal()
     {
     }
 
     public ProteomicsDataServiceInternal(ISessionManager<Session> sessionManager,
             IDAOFactory daoFactory, ICommonBusinessObjectFactory businessObjectFactory,
-            IBusinessObjectFactory boFactory)
+            IBusinessObjectFactory boFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        this(sessionManager, daoFactory, null, businessObjectFactory, boFactory);
+        this(sessionManager, daoFactory, null, businessObjectFactory, boFactory,
+                managedPropertyEvaluatorFactory);
     }
 
     ProteomicsDataServiceInternal(ISessionManager<Session> sessionManager, IDAOFactory daoFactory,
             IPropertiesBatchManager propertiesBatchManager,
-            ICommonBusinessObjectFactory businessObjectFactory, IBusinessObjectFactory boFactory)
+            ICommonBusinessObjectFactory businessObjectFactory, IBusinessObjectFactory boFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         super(sessionManager, daoFactory, propertiesBatchManager);
         sessionManagerFromConstructor = sessionManager;
         this.commonBoFactory = businessObjectFactory;
         this.boFactory = boFactory;
-        experimentLoader = new ExperimentLoader(getDAOFactory());
+        experimentLoader = new ExperimentLoader(getDAOFactory(), managedPropertyEvaluatorFactory);
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     public void replaceAutoWiredSesseionManagerByConstructorSessionManager()
@@ -194,7 +201,8 @@ public class ProteomicsDataServiceInternal extends AbstractServer<IProteomicsDat
                         session.tryGetPerson(), experiments, EntityKind.EXPERIMENT);
         Map<Long, Set<Metaproject>> assignments =
                 MetaprojectTranslator.translateMetaprojectAssignments(assignmentPEs);
-        return ExperimentTranslator.translate(experiments, "", assignments);
+        return ExperimentTranslator.translate(experiments, "", assignments,
+                managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -212,7 +220,8 @@ public class ProteomicsDataServiceInternal extends AbstractServer<IProteomicsDat
                 getDAOFactory().getMetaprojectDAO().listMetaprojectAssignmentsForEntities(
                         session.tryGetPerson(), dataSetPEs, EntityKind.DATA_SET);
         return DataSetTranslator.translate(dataSetPEs, "", "",
-                MetaprojectTranslator.translateMetaprojectAssignments(assignmentPEs));
+                MetaprojectTranslator.translateMetaprojectAssignments(assignmentPEs),
+                managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -236,7 +245,9 @@ public class ProteomicsDataServiceInternal extends AbstractServer<IProteomicsDat
                         + " [" + experiment.getIdentifier() + "] is not of type " + experimentType
                         + " but of type " + actualExperimentTypeCode + ".");
             }
-            Experiment translatedExperiment = ExperimentTranslator.translate(experiment, "", null);
+            Experiment translatedExperiment =
+                    ExperimentTranslator.translate(experiment, "", null,
+                            managedPropertyEvaluatorFactory);
             if (EXPERIMENT_VALIDATOR.isValid(person, translatedExperiment))
             {
                 List<DataPE> dataSets = dataSetDAO.listDataSets(experiment);
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/BusinessObjectFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/BusinessObjectFactory.java
index 7c1186d1d0ef8b64c7ec66bc009b318a54c3831f..c7b486a1e57b270573efe64f073dabff33d829d6 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/BusinessObjectFactory.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/BusinessObjectFactory.java
@@ -24,14 +24,15 @@ import ch.systemsx.cisd.openbis.plugin.AbstractPluginBusinessObjectFactory;
 import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
-public class BusinessObjectFactory  extends AbstractPluginBusinessObjectFactory implements IBusinessObjectFactory
+public class BusinessObjectFactory extends AbstractPluginBusinessObjectFactory implements
+        IBusinessObjectFactory
 {
     private final IDAOFactory daoFactory;
+
     private final IPhosphoNetXDAOFactory specificDAOFactory;
+
     private final ICommonBusinessObjectFactory businessObjectFactory;
 
     public BusinessObjectFactory(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory,
@@ -65,7 +66,7 @@ public class BusinessObjectFactory  extends AbstractPluginBusinessObjectFactory
     {
         return new ProteinSummaryTable(daoFactory, specificDAOFactory, session);
     }
-    
+
     @Override
     public IProteinSequenceTable createProteinSequenceTable(Session session)
     {
@@ -87,13 +88,15 @@ public class BusinessObjectFactory  extends AbstractPluginBusinessObjectFactory
     @Override
     public IProteinRelatedSampleTable createProteinRelatedSampleTable(Session session)
     {
-        return new ProteinRelatedSampleTable(daoFactory, specificDAOFactory);
+        return new ProteinRelatedSampleTable(daoFactory, specificDAOFactory,
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
     public ISampleTable createSampleTable(Session session)
     {
-        return new SampleTable(daoFactory, specificDAOFactory, session);
+        return new SampleTable(daoFactory, specificDAOFactory, session,
+                getManagedPropertyEvaluatorFactory());
     }
 
     @Override
@@ -113,7 +116,5 @@ public class BusinessObjectFactory  extends AbstractPluginBusinessObjectFactory
     {
         return new SampleLoader(session, daoFactory, businessObjectFactory);
     }
-    
-    
 
 }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoader.java
index cba31196ff747840e057faf6ffb5b6ea602e9ee6..0960b180b97dd57867a109c0595bafa9ed79d2a6 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoader.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoader.java
@@ -26,6 +26,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator.LoadableFields;
 
@@ -36,10 +37,13 @@ public class ExperimentLoader
 {
     private final IDAOFactory daoFactory;
 
-    public ExperimentLoader(IDAOFactory daoFactory)
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
+    public ExperimentLoader(IDAOFactory daoFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.daoFactory = daoFactory;
-
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     public void enrichWithExperiments(Collection<Sample> samples)
@@ -65,7 +69,8 @@ public class ExperimentLoader
         for (ExperimentPE experiment : experiments)
         {
             Experiment e =
-                    ExperimentTranslator.translate(experiment, "", null, LoadableFields.PROPERTIES);
+                    ExperimentTranslator.translate(experiment, "", null,
+                            managedPropertyEvaluatorFactory, LoadableFields.PROPERTIES);
             List<Sample> list = samplesByID.get(experiment.getId());
             for (Sample sample : list)
             {
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTable.java
index bc725c53e852fca9cf66914d5de737f71a5a2e42..5d8eb95f72e0d9da3b817292c9be62e5ae3e9c19 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTable.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTable.java
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.EntityPropertyTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTypeTranslator;
 import ch.systemsx.cisd.openbis.plugin.proteomics.server.dataaccess.IPhosphoNetXDAOFactory;
@@ -43,23 +44,27 @@ import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.SamplePeptideModifi
 
 /**
  * Implementation of {@link IProteinRelatedSampleTable}.
- *
+ * 
  * @author Franz-Josef Elmer
  */
 class ProteinRelatedSampleTable implements IProteinRelatedSampleTable
 {
     private final IDAOFactory daoFactory;
-    
+
     private final IPhosphoNetXDAOFactory specificDAOFactory;
-    
+
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     private List<ProteinRelatedSample> result;
 
-    ProteinRelatedSampleTable(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory)
+    ProteinRelatedSampleTable(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.daoFactory = daoFactory;
         this.specificDAOFactory = specificDAOFactory;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
-    
+
     @Override
     public List<ProteinRelatedSample> getSamples()
     {
@@ -164,7 +169,7 @@ class ProteinRelatedSampleTable implements IProteinRelatedSampleTable
         s.setModificationPosition((long) position);
         return s;
     }
-    
+
     private ProteinRelatedSample createFrom(SamplePE sample, Map<PropertyTypePE, PropertyType> cache)
     {
         ProteinRelatedSample s = new ProteinRelatedSample();
@@ -173,7 +178,8 @@ class ProteinRelatedSampleTable implements IProteinRelatedSampleTable
         s.setId(sample.getId());
         s.setIdentifier(sample.getIdentifier());
         s.setPermId(sample.getPermId());
-        s.setProperties(EntityPropertyTranslator.translate(sample.getProperties(), cache));
+        s.setProperties(EntityPropertyTranslator.translate(sample.getProperties(), cache,
+                managedPropertyEvaluatorFactory));
         return s;
     }
 
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleTable.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleTable.java
index 00d88611ebd2cb30f1e4506feedb730b55522af6..2632282d42cb4fbd2705257cded214042e033783 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleTable.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/SampleTable.java
@@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.EntityPropertyTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTypeTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
@@ -47,10 +48,14 @@ class SampleTable extends AbstractBusinessObject implements ISampleTable
 
     private SampleIDProvider sampleIDProvider;
 
-    SampleTable(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, Session session)
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
+    SampleTable(IDAOFactory daoFactory, IPhosphoNetXDAOFactory specificDAOFactory, Session session,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         super(daoFactory, specificDAOFactory, session);
         sampleIDProvider = new SampleIDProvider(daoFactory.getSampleDAO());
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     @Override
@@ -80,7 +85,7 @@ class SampleTable extends AbstractBusinessObject implements ISampleTable
                 String samplePermID = sampleAbundance.getSamplePermID();
                 long sampleID = sampleIDProvider.getSampleIDOrParentSampleID(samplePermID);
                 SamplePE samplePE = sampleDAO.getByTechId(new TechId(sampleID));
-                fillSampleData(sample, samplePE);
+                fillSampleData(sample, samplePE, managedPropertyEvaluatorFactory);
                 samples.add(sample);
             }
         } finally
@@ -90,7 +95,8 @@ class SampleTable extends AbstractBusinessObject implements ISampleTable
     }
 
     private final static void fillSampleData(final SampleWithPropertiesAndAbundance result,
-            final SamplePE samplePE)
+            final SamplePE samplePE,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         result.setId(HibernateUtils.getId(samplePE));
         result.setPermId(samplePE.getPermId());
@@ -99,6 +105,6 @@ class SampleTable extends AbstractBusinessObject implements ISampleTable
         result.setSampleType(SampleTypeTranslator.translate(samplePE.getSampleType(),
                 new HashMap<PropertyTypePE, PropertyType>()));
         result.setProperties(EntityPropertyTranslator.translate(samplePE.getProperties(),
-                new HashMap<PropertyTypePE, PropertyType>()));
+                new HashMap<PropertyTypePE, PropertyType>(), managedPropertyEvaluatorFactory));
     }
 }
diff --git a/rtd_phosphonetx/source/java/proteomics-plugin-applicationContext.xml b/rtd_phosphonetx/source/java/proteomics-plugin-applicationContext.xml
index 9051fee4dd0cc826dd4abe93c00053717f1831ac..36b0a130a1992237ef52b1789934d23488abacf4 100644
--- a/rtd_phosphonetx/source/java/proteomics-plugin-applicationContext.xml
+++ b/rtd_phosphonetx/source/java/proteomics-plugin-applicationContext.xml
@@ -47,6 +47,7 @@
         <constructor-arg ref="dao-factory"/>
         <constructor-arg ref="common-business-object-factory" />
         <constructor-arg ref="proteomics-bo-factory" />
+        <constructor-arg ref="managed-property-evaluator-factory" />
     </bean>
     
     <bean id="proteomics-data-service-web" 
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java
index d048b530dba5c1908e4792e53dcbbd5a78c34d6c..30ebdab47e8cb6b204e0d4d5557845bbab401860 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java
@@ -60,6 +60,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.IBusinessObjectFactory;
 import ch.systemsx.cisd.openbis.plugin.proteomics.server.business.ISampleLoader;
 import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal;
@@ -98,7 +99,8 @@ public class ProteomicsDataServiceInternalTest extends AbstractServerTestCase
         sampleLoader = context.mock(ISampleLoader.class);
         service =
                 new ProteomicsDataServiceInternal(sessionManager, daoFactory,
-                        propertiesBatchManager, commonBoFactory, boFactory);
+                        propertiesBatchManager, commonBoFactory, boFactory,
+                        new ManagedPropertyEvaluatorFactory(null, null));
         experimentType = new ExperimentTypePE();
         experimentType.setCode(EXPERIMENT_TYPE);
         experimentType.setDatabaseInstance(CommonTestUtils.createHomeDatabaseInstance());
@@ -283,7 +285,7 @@ public class ProteomicsDataServiceInternalTest extends AbstractServerTestCase
 
                     one(experimentDAO).listExperimentsWithProperties(experimentType, null, null);
                     will(returnValue(Arrays.asList(experiments)));
-                    
+
                     one(metaprojectDAO).listMetaprojectAssignmentsForEntities(
                             session.tryGetPerson(), Arrays.asList(experiments),
                             EntityKind.EXPERIMENT);
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoaderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoaderTest.java
index 12cc28d0cfcff00c9a91a48ccf912a9975fb6fe3..7f54a9c28dab76a5e36bc3fdb797ffe7551fcbec 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoaderTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ExperimentLoaderTest.java
@@ -27,6 +27,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator;
 
 /**
@@ -38,7 +39,8 @@ public class ExperimentLoaderTest extends AbstractLoaderTestCase
     @Test
     public void test()
     {
-        ExperimentLoader loader = new ExperimentLoader(daoFactory);
+        ExperimentLoader loader =
+                new ExperimentLoader(daoFactory, new ManagedPropertyEvaluatorFactory(null, null));
         List<Sample> samples = loadSamples(980L, 981L, 986L);
 
         loader.enrichWithExperiments(samples);
@@ -66,7 +68,8 @@ public class ExperimentLoaderTest extends AbstractLoaderTestCase
         List<Sample> list = new ArrayList<Sample>();
         for (Long id : ids)
         {
-            list.add(SampleTranslator.translate(sampleDAO.tryGetByTechId(new TechId(id)), "", null));
+            list.add(SampleTranslator.translate(sampleDAO.tryGetByTechId(new TechId(id)), "", null,
+                    new ManagedPropertyEvaluatorFactory(null, null)));
 
         }
         return list;
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTableTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTableTest.java
index 68e9ddcc5dd58e380c492b315363b3ba5a3ec769..e2fdeecda1672c5cdc22378b32a1b628d09128b6 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTableTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/business/ProteinRelatedSampleTableTest.java
@@ -37,20 +37,22 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.builders.EntityTypePropertyTy
 import ch.systemsx.cisd.openbis.generic.shared.dto.builders.SamplePEBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.builders.SampleTypePEBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.builders.SpacePEBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.plugin.proteomics.shared.basic.dto.ProteinRelatedSample;
 import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.SampleAbundance;
 import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.SamplePeptideModification;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class ProteinRelatedSampleTableTest extends AbstractBOTestCase
 {
     private ProteinRelatedSampleTable table;
+
     private SamplePE sample1;
+
     private SamplePE sample2;
+
     private SamplePE sample3;
 
     @Override
@@ -58,7 +60,9 @@ public class ProteinRelatedSampleTableTest extends AbstractBOTestCase
     public void setUp()
     {
         super.setUp();
-        table = new ProteinRelatedSampleTable(daoFactory, specificDAOFactory);
+        table =
+                new ProteinRelatedSampleTable(daoFactory, specificDAOFactory,
+                        new ManagedPropertyEvaluatorFactory(null, null));
 
         SpacePE space =
                 new SpacePEBuilder()
@@ -93,12 +97,12 @@ public class ProteinRelatedSampleTableTest extends AbstractBOTestCase
                 {
                     one(specificDAOFactory).getProteinQueryDAO(experimentID);
                     will(returnValue(proteinDAO));
-                    
+
                     one(experimentDAO).getByTechId(experimentID);
                     ExperimentPE experiment = new ExperimentPE();
                     experiment.setPermId("exp-1");
                     will(returnValue(experiment));
-                    
+
                     one(proteinDAO).listSampleAbundanceByProtein(experiment.getPermId(),
                             proteinReferenceID.getId());
                     MockDataSet<SampleAbundance> sampleAbundances =
@@ -118,28 +122,34 @@ public class ProteinRelatedSampleTableTest extends AbstractBOTestCase
 
                     one(sampleDAO).tryToFindByPermID("s-1");
                     will(returnValue(sample1));
-                    
+
                     one(sampleDAO).tryToFindByPermID("s-2");
                     will(returnValue(sample2));
-                    
+
                     one(sampleDAO).tryToFindByPermID("s-3");
                     will(returnValue(sample3));
                 }
             });
-        
+
         table.load(experimentID, proteinReferenceID, "abcdefabcab");
-        
+
         List<ProteinRelatedSample> samples = table.getSamples();
-        assertEquals("1:s-1:S1:MY-DB:/s/S1:SAMPLE:my-type:[A: hello]:0.25::null:null:null", render(samples.get(0)));
-        assertEquals("2:s-2:S2:MY-DB:/s/S2:SAMPLE:my-type:[]:0.75:a:1:21.5:0.25", render(samples.get(1)));
-        assertEquals("2:s-2:S2:MY-DB:/s/S2:SAMPLE:my-type:[]:0.75:a:7:21.5:0.25", render(samples.get(2)));
-        assertEquals("2:s-2:S2:MY-DB:/s/S2:SAMPLE:my-type:[]:0.75:a:10:21.5:0.25", render(samples.get(3)));
-        assertEquals("3:s-3:S3:MY-DB:/s/S3:SAMPLE:my-type:[]:null:d:4:12.375:0.5", render(samples.get(4)));
-        assertEquals("3:s-3:S3:MY-DB:/s/S3:SAMPLE:my-type:[]:null:f:6:-1.5:0.75", render(samples.get(5)));
+        assertEquals("1:s-1:S1:MY-DB:/s/S1:SAMPLE:my-type:[A: hello]:0.25::null:null:null",
+                render(samples.get(0)));
+        assertEquals("2:s-2:S2:MY-DB:/s/S2:SAMPLE:my-type:[]:0.75:a:1:21.5:0.25",
+                render(samples.get(1)));
+        assertEquals("2:s-2:S2:MY-DB:/s/S2:SAMPLE:my-type:[]:0.75:a:7:21.5:0.25",
+                render(samples.get(2)));
+        assertEquals("2:s-2:S2:MY-DB:/s/S2:SAMPLE:my-type:[]:0.75:a:10:21.5:0.25",
+                render(samples.get(3)));
+        assertEquals("3:s-3:S3:MY-DB:/s/S3:SAMPLE:my-type:[]:null:d:4:12.375:0.5",
+                render(samples.get(4)));
+        assertEquals("3:s-3:S3:MY-DB:/s/S3:SAMPLE:my-type:[]:null:f:6:-1.5:0.75",
+                render(samples.get(5)));
         assertEquals(6, samples.size());
         context.assertIsSatisfied();
     }
-    
+
     private String render(ProteinRelatedSample sample)
     {
         char modifiedAminoAcid = sample.getModifiedAminoAcid();
@@ -151,7 +161,7 @@ public class ProteinRelatedSampleTableTest extends AbstractBOTestCase
                 + sample.getModificationPosition() + ":" + sample.getModificationMass() + ":"
                 + sample.getModificationFraction();
     }
-    
+
     private SampleAbundance sampleAbundance(String permID, double abundance)
     {
         SampleAbundance sampleAbundance = new SampleAbundance();
@@ -159,7 +169,7 @@ public class ProteinRelatedSampleTableTest extends AbstractBOTestCase
         sampleAbundance.setAbundance(abundance);
         return sampleAbundance;
     }
-    
+
     private SamplePeptideModification modification(String permID, String sequence, int position,
             double mass, double fraction)
     {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
index 8a8182cf74b0626d647ca09dcc48c44b1e9c8685..367c25e3790ade20f63e3b0a4ce9c9e0d0343b91 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
@@ -33,6 +33,7 @@ import ch.systemsx.cisd.authentication.ISessionManager;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext;
 import ch.systemsx.cisd.openbis.generic.server.AbstractServer;
+import ch.systemsx.cisd.openbis.generic.server.ComponentNames;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.AuthorizationGuard;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.Capability;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.ReturnValueFilter;
@@ -69,6 +70,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.MetaprojectTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.VocabularyTranslator;
@@ -165,6 +167,9 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     @Resource(name = ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames.GENERIC_PLUGIN_SERVER)
     private IGenericServer genericServer;
 
+    @Resource(name = ComponentNames.MANAGED_PROPERTY_EVALUATOR_FACTORY)
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     private AnalysisSettings analysisSettings;
 
     public ScreeningServer()
@@ -227,7 +232,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         session.tryGetPerson(), sample);
         return SampleTranslator.translate(getSampleTypeSlaveServerPlugin(sample.getSampleType())
                 .getSampleInfo(session, sample), session.getBaseIndexURL(), MetaprojectTranslator
-                .translate(metaprojectPEs));
+                .translate(metaprojectPEs), managedPropertyEvaluatorFactory);
     }
 
     @Override
@@ -237,7 +242,8 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
             TechId plateId)
     {
         Session session = getSession(sessionToken);
-        return PlateContentLoader.loadImagesAndMetadata(session, businessObjectFactory, plateId);
+        return PlateContentLoader.loadImagesAndMetadata(session, businessObjectFactory,
+                managedPropertyEvaluatorFactory, plateId);
     }
 
     @Override
@@ -247,8 +253,8 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
             DatasetReference dataset, CodeAndLabel featureName)
     {
         Session session = getSession(sessionToken);
-        return PlateContentLoader.loadFeatureVectorDataset(session, businessObjectFactory, dataset,
-                featureName);
+        return PlateContentLoader.loadFeatureVectorDataset(session, businessObjectFactory,
+                managedPropertyEvaluatorFactory, dataset, featureName);
     }
 
     @Override
@@ -259,7 +265,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     {
         Session session = getSession(sessionToken);
         return PlateContentLoader.loadImagesAndMetadataForDataset(session, businessObjectFactory,
-                datasetId);
+                managedPropertyEvaluatorFactory, datasetId);
     }
 
     @Override
@@ -314,8 +320,8 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
             String datasetCode, String datastoreCode, WellLocation wellLocationOrNull)
     {
         Session session = getSession(sessionToken);
-        return LogicalImageLoader.loadLogicalImageInfo(session, businessObjectFactory, datasetCode,
-                datastoreCode, wellLocationOrNull);
+        return LogicalImageLoader.loadLogicalImageInfo(session, businessObjectFactory,
+                managedPropertyEvaluatorFactory, datasetCode, datastoreCode, wellLocationOrNull);
     }
 
     @Override
@@ -326,7 +332,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     {
         Session session = getSession(sessionToken);
         return LogicalImageLoader.getImageDatasetReference(session, businessObjectFactory,
-                datasetCode, datastoreCode);
+                managedPropertyEvaluatorFactory, datasetCode, datastoreCode);
     }
 
     @Override
@@ -349,7 +355,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     {
         Session session = getSession(sessionToken);
         return PlateContentLoader.getImageDatasetInfosForSample(session, businessObjectFactory,
-                sampleId, wellLocationOrNull);
+                managedPropertyEvaluatorFactory, sampleId, wellLocationOrNull);
     }
 
     @Override
@@ -658,7 +664,8 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     private ScreeningApiImpl createScreeningApiImpl(String sessionToken)
     {
         final Session session = getSession(sessionToken);
-        return new ScreeningApiImpl(session, businessObjectFactory, getDAOFactory());
+        return new ScreeningApiImpl(session, businessObjectFactory, getDAOFactory(),
+                managedPropertyEvaluatorFactory);
     }
 
     @Override
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/LogicalImageLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/LogicalImageLoader.java
index 20e520e655f045f66fba6c308d9a149d8b5c48f2..274c8662475f4a21119aa460908151b875d4d032 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/LogicalImageLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/LogicalImageLoader.java
@@ -24,6 +24,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.IDataBO;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
@@ -48,12 +49,14 @@ public class LogicalImageLoader
      * in HCS case).
      */
     public static LogicalImageInfo loadLogicalImageInfo(Session session,
-            IScreeningBusinessObjectFactory businessObjectFactory, String datasetCode,
+            IScreeningBusinessObjectFactory businessObjectFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory, String datasetCode,
             String datastoreCode, WellLocation wellLocationOrNull)
     {
         LogicalImageInfo logicalImageInfo =
-                new LogicalImageLoader(session, businessObjectFactory).tryLoadLogicalImageInfo(
-                        datasetCode, datastoreCode, wellLocationOrNull);
+                new LogicalImageLoader(session, businessObjectFactory,
+                        managedPropertyEvaluatorFactory).tryLoadLogicalImageInfo(datasetCode,
+                        datastoreCode, wellLocationOrNull);
         if (logicalImageInfo == null)
         {
             throw new IllegalStateException(String.format("Dataset '%s' is not an image dataset.",
@@ -63,21 +66,28 @@ public class LogicalImageLoader
     }
 
     public static ImageDatasetEnrichedReference getImageDatasetReference(Session session,
-            IScreeningBusinessObjectFactory businessObjectFactory, String datasetCode,
+            IScreeningBusinessObjectFactory businessObjectFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory, String datasetCode,
             String datastoreCode)
     {
-        return new LogicalImageLoader(session, businessObjectFactory).getImageDatasetReference(
-                datasetCode, datastoreCode);
+        return new LogicalImageLoader(session, businessObjectFactory,
+                managedPropertyEvaluatorFactory).getImageDatasetReference(datasetCode,
+                datastoreCode);
     }
 
     private final Session session;
 
     private final IScreeningBusinessObjectFactory businessObjectFactory;
 
-    public LogicalImageLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory)
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
+    public LogicalImageLoader(Session session,
+            IScreeningBusinessObjectFactory businessObjectFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.session = session;
         this.businessObjectFactory = businessObjectFactory;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     private ImageDatasetEnrichedReference getImageDatasetReference(String datasetCode,
@@ -223,6 +233,7 @@ public class LogicalImageLoader
 
     private ExternalData translate(DataPE dataSet)
     {
-        return DataSetTranslator.translate(dataSet, session.getBaseIndexURL(), null);
+        return DataSetTranslator.translate(dataSet, session.getBaseIndexURL(), null,
+                managedPropertyEvaluatorFactory);
     }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateContentLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateContentLoader.java
index ece64f30a462917f8711390f0dd7bcd3d9a31c5d..d5a21b69909b377c24bb6d4d6e007c4b72789cfa 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateContentLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateContentLoader.java
@@ -48,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.EntityPropertyTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator;
@@ -87,30 +88,34 @@ public class PlateContentLoader
      * image analysis datasets.
      */
     public static PlateContent loadImagesAndMetadata(Session session,
-            IScreeningBusinessObjectFactory businessObjectFactory, TechId plateId)
+            IScreeningBusinessObjectFactory businessObjectFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory, TechId plateId)
     {
-        return new PlateContentLoader(session, businessObjectFactory).getPlateContent(plateId);
+        return new PlateContentLoader(session, businessObjectFactory,
+                managedPropertyEvaluatorFactory).getPlateContent(plateId);
     }
 
     /**
      * Loads feature vector of specified dataset with one feature specified by name.
      */
     public static FeatureVectorDataset loadFeatureVectorDataset(Session session,
-            IScreeningBusinessObjectFactory businessObjectFactory, DatasetReference dataset,
-            CodeAndLabel featureName)
+            IScreeningBusinessObjectFactory businessObjectFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory,
+            DatasetReference dataset, CodeAndLabel featureName)
     {
-        return new PlateContentLoader(session, businessObjectFactory).fetchFeatureVector(dataset,
-                featureName);
+        return new PlateContentLoader(session, businessObjectFactory,
+                managedPropertyEvaluatorFactory).fetchFeatureVector(dataset, featureName);
     }
 
     /**
      * Loads data about the plate for a specified dataset, which is supposed to contain images.
      */
     public static PlateImages loadImagesAndMetadataForDataset(Session session,
-            IScreeningBusinessObjectFactory businessObjectFactory, TechId datasetId)
+            IScreeningBusinessObjectFactory businessObjectFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory, TechId datasetId)
     {
-        return new PlateContentLoader(session, businessObjectFactory)
-                .getPlateContentForDataset(datasetId);
+        return new PlateContentLoader(session, businessObjectFactory,
+                managedPropertyEvaluatorFactory).getPlateContentForDataset(datasetId);
     }
 
     /**
@@ -119,18 +124,21 @@ public class PlateContentLoader
      * sample (restricted to one well in HCS case).
      */
     public static ImageSampleContent getImageDatasetInfosForSample(Session session,
-            IScreeningBusinessObjectFactory businessObjectFactory, TechId sampleId,
+            IScreeningBusinessObjectFactory businessObjectFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory, TechId sampleId,
             WellLocation wellLocationOrNull)
     {
-        return new PlateContentLoader(session, businessObjectFactory)
-                .getImageDatasetInfosForSample(sampleId, wellLocationOrNull);
+        return new PlateContentLoader(session, businessObjectFactory,
+                managedPropertyEvaluatorFactory).getImageDatasetInfosForSample(sampleId,
+                wellLocationOrNull);
     }
 
     public static List<PlateMetadata> loadPlateMetadata(Session session,
-            IScreeningBusinessObjectFactory businessObjectFactory, List<TechId> plateIds)
+            IScreeningBusinessObjectFactory businessObjectFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory, List<TechId> plateIds)
     {
-        return new PlateContentLoader(session, businessObjectFactory).getPlateMetadatas(plateIds);
-
+        return new PlateContentLoader(session, businessObjectFactory,
+                managedPropertyEvaluatorFactory).getPlateMetadatas(plateIds);
     }
 
     private final Session session;
@@ -139,12 +147,18 @@ public class PlateContentLoader
 
     private final LogicalImageLoader imageLoader;
 
+    private final IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     private PlateContentLoader(Session session,
-            IScreeningBusinessObjectFactory businessObjectFactory)
+            IScreeningBusinessObjectFactory businessObjectFactory,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.session = session;
         this.businessObjectFactory = businessObjectFactory;
-        this.imageLoader = new LogicalImageLoader(session, businessObjectFactory);
+        this.imageLoader =
+                new LogicalImageLoader(session, businessObjectFactory,
+                        managedPropertyEvaluatorFactory);
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     private PlateImages getPlateContentForDataset(TechId datasetId)
@@ -174,7 +188,8 @@ public class PlateContentLoader
     private Geometry getPlateGeometry(SamplePE plate)
     {
         List<IEntityProperty> properties =
-                EntityPropertyTranslator.translate(plate.getProperties(), null);
+                EntityPropertyTranslator.translate(plate.getProperties(), null,
+                        managedPropertyEvaluatorFactory);
         return PlateDimensionParser.getPlateGeometry(properties);
     }
 
@@ -359,7 +374,7 @@ public class PlateContentLoader
         for (T dataset : datasets)
         {
             datasetReferences.add(ScreeningUtils.createDatasetReference(dataset,
-                    session.getBaseIndexURL()));
+                    session.getBaseIndexURL(), managedPropertyEvaluatorFactory));
         }
         return datasetReferences;
     }
@@ -380,7 +395,8 @@ public class PlateContentLoader
 
     private Sample translate(SamplePE sample)
     {
-        return SampleTranslator.translate(sample, session.getBaseIndexURL(), null);
+        return SampleTranslator.translate(sample, session.getBaseIndexURL(), null,
+                managedPropertyEvaluatorFactory);
     }
 
     private List<WellMetadata> loadWells(TechId plateId)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImpl.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImpl.java
index d12829923b5a3d83957eb62a378a5d3c9f58c0f0..9444097583387e827dfd65e8c3dd2e93de61a9c3 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImpl.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImpl.java
@@ -60,6 +60,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceId
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleOwnerIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTypeTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
@@ -108,12 +109,15 @@ public class ScreeningApiImpl
 
     private final IDAOFactory daoFactory;
 
+    private IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory;
+
     public ScreeningApiImpl(Session session, IScreeningBusinessObjectFactory businessObjectFactory,
-            IDAOFactory daoFactory)
+            IDAOFactory daoFactory, IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         this.session = session;
         this.businessObjectFactory = businessObjectFactory;
         this.daoFactory = daoFactory;
+        this.managedPropertyEvaluatorFactory = managedPropertyEvaluatorFactory;
     }
 
     public List<FeatureVectorDatasetReference> listFeatureVectorDatasets(
@@ -440,7 +444,9 @@ public class ScreeningApiImpl
             SampleIdentifier sampleIdentifier = createSampleIdentifier(plateIdentifier);
             ISampleBO sampleBO = businessObjectFactory.createSampleBO(session);
             sampleBO.loadBySampleIdentifier(sampleIdentifier);
-            sample = SampleTranslator.translate(sampleBO.getSample(), "", null);
+            sample =
+                    SampleTranslator.translate(sampleBO.getSample(), "", null,
+                            managedPropertyEvaluatorFactory);
         }
         return sample;
     }
@@ -472,7 +478,8 @@ public class ScreeningApiImpl
 
     private Sample translate(SamplePE sample)
     {
-        return SampleTranslator.translate(sample, session.getBaseIndexURL(), null);
+        return SampleTranslator.translate(sample, session.getBaseIndexURL(), null,
+                managedPropertyEvaluatorFactory);
     }
 
     private static SampleIdentifier createSampleIdentifier(PlateIdentifier plate)
@@ -884,7 +891,8 @@ public class ScreeningApiImpl
         }
 
         List<ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.PlateMetadata> plateMetadatas =
-                PlateContentLoader.loadPlateMetadata(session, businessObjectFactory, techIds);
+                PlateContentLoader.loadPlateMetadata(session, businessObjectFactory,
+                        managedPropertyEvaluatorFactory, techIds);
 
         List<PlateMetadata> result = new ArrayList<PlateMetadata>();
         Map<Long, Material> materialsCache = new HashMap<Long, Material>();
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
index 9f809a96e2001ebc8ce107c4f268fec1f4a75e51..92b7b5c2f1faebd2d9a9beeff2697abdede8a60e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
@@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataStoreTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.ExperimentTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
@@ -61,13 +62,15 @@ public class ScreeningUtils
         }
     }
 
-    public static DatasetReference createDatasetReference(DataPE dataset, String baseIndexURL)
+    public static DatasetReference createDatasetReference(DataPE dataset, String baseIndexURL,
+            IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         DataStore dataStore = DataStoreTranslator.translate(dataset.getDataStore());
         String dataTypeCode = dataset.getDataSetType().getCode();
         String fileTypeCode = null;
         Experiment experiment =
-                ExperimentTranslator.translate(dataset.getExperiment(), baseIndexURL, null);
+                ExperimentTranslator.translate(dataset.getExperiment(), baseIndexURL, null,
+                        managedPropertyEvaluatorFactory);
         String analysisProcedureOrNull =
                 EntityHelper.tryFindPropertyValue(dataset, ScreeningConstants.ANALYSIS_PROCEDURE);
         return createDatasetReference(dataset.getId(), dataset.getCode(), analysisProcedureOrNull,
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java
index 30ef51705d04e0aad8e12d737aac22ac9bd33bc0..16a43efa2f4aa052ad6efe2e14acadad1202f916 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java
@@ -50,6 +50,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.managed_property.ManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObjectFactory;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.Geometry;
@@ -77,7 +78,9 @@ public class ScreeningApiImplTest extends AbstractServerTestCase
     public void beforeMethod()
     {
         screeningBOFactory = context.mock(IScreeningBusinessObjectFactory.class);
-        screeningApi = new ScreeningApiImpl(session, screeningBOFactory, daoFactory);
+        screeningApi =
+                new ScreeningApiImpl(session, screeningBOFactory, daoFactory,
+                        new ManagedPropertyEvaluatorFactory(null, null));
     }
 
     @Test