diff --git a/datastore_server/.classpath b/datastore_server/.classpath
index 82978ae4cab9ee4d59dba983d965d06bcd1426f6..54d8bcc27cea14aa2614ca1652b7e3aafb1a5f1b 100644
--- a/datastore_server/.classpath
+++ b/datastore_server/.classpath
@@ -88,5 +88,6 @@
 	<classpathentry kind="lib" path="/libraries/jetty8/lib/server/jetty-servlet.jar" sourcepath="/libraries/jetty8/src/jetty_src.zip"/>
 	<classpathentry kind="lib" path="/libraries/jetty8/lib/server/servlet-api-3.0.jar" sourcepath="/libraries/jetty8/src/jetty_src.zip"/>
 	<classpathentry kind="lib" path="/libraries/jetty8/lib/server/jetty-continuation.jar"/>
+	<classpathentry kind="lib" path="/libraries/cisd-hotdeploy/cisd-hotdeploy.jar" sourcepath="/libraries/cisd-hotdeploy/cisd-hotdeploy-src.zip"/>
 	<classpathentry kind="output" path="targets/classes"/>
 </classpath>
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IJavaDataSetRegistrationDropboxV2.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IJavaDataSetRegistrationDropboxV2.java
index 853f24b5e18c93e29a6ededa99c4bfb9fa35f354..aa33e387b904ce5786be408383a13c5c7c576530 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IJavaDataSetRegistrationDropboxV2.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IJavaDataSetRegistrationDropboxV2.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.etlserver.registrator.api.v2;
 
+import ch.ethz.cisd.hotdeploy.Plugin;
 import ch.systemsx.cisd.common.exceptions.NotImplementedException;
 import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationContext;
 
@@ -26,7 +27,7 @@ import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationContext;
  * 
  * @author Pawel Glyzewski
  */
-public interface IJavaDataSetRegistrationDropboxV2
+public interface IJavaDataSetRegistrationDropboxV2 extends Plugin
 {
 
     /**
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/JavaTopLevelDataSetHandlerV2.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/JavaTopLevelDataSetHandlerV2.java
index 8e2489419d6dfd306c6c81703a39c617b1cc7f5a..87d9da8e753cddd545eb4f7bcaa119da5a27560e 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/JavaTopLevelDataSetHandlerV2.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/JavaTopLevelDataSetHandlerV2.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.etlserver.registrator.api.v2;
 
 import java.io.File;
 
+import ch.ethz.cisd.hotdeploy.PluginContainer;
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.common.action.IDelegatedActionWithResult;
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
@@ -52,14 +53,28 @@ public class JavaTopLevelDataSetHandlerV2<T extends DataSetInformation> extends
         String className =
                 PropertyUtils.getMandatoryProperty(globalState.getThreadParameters()
                         .getThreadProperties(), PROGRAM_CLASS_KEY);
-        try
+
+        PluginContainer container =
+                PluginContainer.tryGetInstance(globalState.getThreadParameters().getThreadName());
+
+        if (container != null)
         {
-            programClass =
-                    (Class<? extends IJavaDataSetRegistrationDropboxV2>) Class.forName(className);
-        } catch (ClassNotFoundException ex)
+            programClass = (Class<? extends IJavaDataSetRegistrationDropboxV2>) container
+                    .tryGetPluginClassByClassname(className);
+        }
+
+        if (programClass == null)
         {
-            throw ConfigurationFailureException.fromTemplate("Class '%s' does not exist!",
-                    className);
+            try
+            {
+                programClass =
+                        (Class<? extends IJavaDataSetRegistrationDropboxV2>) Class
+                                .forName(className);
+            } catch (ClassNotFoundException ex)
+            {
+                throw ConfigurationFailureException.fromTemplate("Class '%s' does not exist!",
+                        className);
+            }
         }
 
         DssRegistrationHealthMonitor.getInstance(globalState.getOpenBisService(),
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java
index 3b8e3f30b5de17a1b263b1e03cd7844b3ba4f020..131cfd06f7c73a74cd41caacf01495f742e046ca 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java
@@ -17,10 +17,12 @@
 package ch.systemsx.cisd.openbis.dss.generic.shared.utils;
 
 import java.io.File;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
 
+import ch.ethz.cisd.hotdeploy.PluginContainer;
 import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
 import ch.systemsx.cisd.common.filesystem.FileOperations;
@@ -97,7 +99,21 @@ public class DssPropertyParametersUtil
         ExtendedProperties serviceProperties = extendProperties(properties);
         CorePluginsInjector injector =
                 new CorePluginsInjector(ScannerType.DSS, DssPluginType.values());
-        injector.injectCorePlugins(serviceProperties);
+        Map<String, File> pluginFolders =
+                injector.injectCorePlugins(serviceProperties);
+
+        if (PluginContainer.tryGetInstance() == null)
+        {
+            PluginContainer.initHotDeployment();
+
+            for (String name : pluginFolders.keySet())
+            {
+                PluginContainer pluginContainer = PluginContainer.initHotDeployment(name);
+                pluginContainer.addPluginDirectory(pluginFolders.get(name));
+                pluginContainer.refresh(true);
+            }
+        }
+
         return serviceProperties;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginsInjector.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginsInjector.java
index dafeb30571e9a5174c76117bf238e9e468a04441..ccb59f411a4c20500000e784a49eaca03e620852 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginsInjector.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginsInjector.java
@@ -21,6 +21,7 @@ import java.io.FileInputStream;
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -94,14 +95,15 @@ public class CorePluginsInjector
         }
     }
 
-    public void injectCorePlugins(Properties properties)
+    public Map<String, File> injectCorePlugins(Properties properties)
     {
         String corePluginsFolderPath =
                 CorePluginsUtils.getCorePluginsFolder(properties, scannerType);
-        injectCorePlugins(properties, corePluginsFolderPath);
+        return injectCorePlugins(properties, corePluginsFolderPath);
     }
 
-    public void injectCorePlugins(Properties properties, String corePluginsFolderPath)
+    public Map<String, File> injectCorePlugins(Properties properties,
+            String corePluginsFolderPath)
     {
         ModuleEnabledChecker moduleEnabledChecker = new ModuleEnabledChecker(properties);
         List<String> disabledPlugins = PropertyUtils.getList(properties, DISABLED_CORE_PLUGINS_KEY);
@@ -155,6 +157,17 @@ public class CorePluginsInjector
             }
         }
         pluginKeyBundles.addOrReplaceKeyBundleIn(properties);
+
+        Map<String, File> pluginFolders = new HashMap<String, File>();
+        for (Map<String, NamedCorePluginFolder> map : plugins.values())
+        {
+            for (String name : map.keySet())
+            {
+                pluginFolders.put(name, map.get(name).getDefiningFolder());
+            }
+        }
+        return pluginFolders;
+
     }
 
     private void injectProperty(Properties properties, String key, String value)