diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjector.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjector.java
index 451b9dc5b4e4d429ef4822468712e03610900bd8..b32f6d88c35d286d0cc5ac38cb9364844a6540b6 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjector.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjector.java
@@ -42,8 +42,8 @@ import ch.systemsx.cisd.common.logging.LogLevel;
 import ch.systemsx.cisd.common.maintenance.MaintenanceTaskUtils;
 import ch.systemsx.cisd.common.utilities.PropertyParametersUtil;
 import ch.systemsx.cisd.openbis.dss.generic.shared.Constants;
-import ch.systemsx.cisd.openbis.generic.server.coreplugin.CorePluginScanner;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CorePlugin;
+import ch.systemsx.cisd.openbis.generic.shared.coreplugin.CorePluginScanner;
 
 /**
  * 
diff --git a/openbis/resource/test-data/core-plugins/plugin-X/17/dss/.gitignore b/openbis/resource/test-data/core-plugins/plugin-X/17/dss/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openbis/resource/test-data/core-plugins/plugin-Y/2/dss/.gitignore b/openbis/resource/test-data/core-plugins/plugin-Y/2/dss/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
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 39965fa5e9906bc7767880b80d629db8ce3a070e..a694f573433ff16bb3fff5231b7dbe39124d9242 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
@@ -75,7 +75,6 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.dynamic_property.calc
 import ch.systemsx.cisd.openbis.generic.server.business.bo.dynamic_property.calculator.api.IEntityAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.materiallister.IMaterialLister;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister;
-import ch.systemsx.cisd.openbis.generic.server.coreplugin.ICorePluginResourceLoader;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataStoreDAO;
@@ -176,6 +175,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermReplaceme
 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.coreplugin.ICorePluginResourceLoader;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentHolderPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AuthorizationGroupPE;
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 52d5ba2a23815fbfeb5d630d18555b7dfd6f2342..65c0312707d02337c1307573066dabdd93de0f14 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
@@ -25,7 +25,6 @@ import org.apache.log4j.Level;
 
 import ch.systemsx.cisd.authentication.ISessionManager;
 import ch.systemsx.cisd.common.spring.IInvocationLoggerContext;
-import ch.systemsx.cisd.openbis.generic.server.coreplugin.ICorePluginResourceLoader;
 import ch.systemsx.cisd.openbis.generic.shared.AbstractServerLogger;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -98,6 +97,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermReplacement;
 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.coreplugin.ICorePluginResourceLoader;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ICommonServerForInternalUse.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ICommonServerForInternalUse.java
index 7caf5c644009865177f21adbf29fc224c148f24d..43fccb94e9eb51b10cff3bda849734ee9fde48f0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ICommonServerForInternalUse.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ICommonServerForInternalUse.java
@@ -20,10 +20,10 @@ import java.util.List;
 
 import org.springframework.transaction.annotation.Transactional;
 
-import ch.systemsx.cisd.openbis.generic.server.coreplugin.ICorePluginResourceLoader;
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CorePlugin;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
+import ch.systemsx.cisd.openbis.generic.shared.coreplugin.ICorePluginResourceLoader;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
 
 /**
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 c8b54466950efce73f441dc4eaca90d4c75f6640..fe1134ae8e45ea645807a5b7c414736ab816e262 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
@@ -28,11 +28,11 @@ import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.logging.LogLevel;
 import ch.systemsx.cisd.openbis.generic.server.coreplugin.AsCorePluginPaths;
-import ch.systemsx.cisd.openbis.generic.server.coreplugin.ICorePluginResourceLoader;
 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.server.jython.api.v1.impl.MasterDataRegistrationException;
 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.translator.CorePluginTranslator;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ICorePluginTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ICorePluginTable.java
index 2e93f8c05bfbb01997aabfe84af23b7e0a9a1582..7f617539d4d7afb36b03137ecca03b10ffff139d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ICorePluginTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ICorePluginTable.java
@@ -18,8 +18,8 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
 import java.util.List;
 
-import ch.systemsx.cisd.openbis.generic.server.coreplugin.ICorePluginResourceLoader;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CorePlugin;
+import ch.systemsx.cisd.openbis.generic.shared.coreplugin.ICorePluginResourceLoader;
 
 /**
  * @author Kaloyan Enimanev
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/CorePluginRegistrator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/CorePluginRegistrator.java
index fcb9212dd34738f024190d5332fc50e420fbac7c..8073eeabff2d2d6574a5680eed850c58b98fd42d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/CorePluginRegistrator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/CorePluginRegistrator.java
@@ -25,8 +25,9 @@ import org.springframework.beans.factory.InitializingBean;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
-import ch.systemsx.cisd.openbis.generic.server.coreplugin.CorePluginScanner.ScannerType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CorePlugin;
+import ch.systemsx.cisd.openbis.generic.shared.coreplugin.CorePluginScanner;
+import ch.systemsx.cisd.openbis.generic.shared.coreplugin.CorePluginScanner.ScannerType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
 import ch.systemsx.cisd.openbis.generic.shared.util.ServerUtils;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/CorePluginScanner.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginScanner.java
similarity index 95%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/CorePluginScanner.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginScanner.java
index ce7f073557d8fcf82bac1102ddf88b50213f4ec0..cc8c756d65a14c238290519be5844db167a4efdc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/CorePluginScanner.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginScanner.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.server.coreplugin;
+package ch.systemsx.cisd.openbis.generic.shared.coreplugin;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -120,7 +120,11 @@ public class CorePluginScanner implements ICorePluginResourceLoader
             if (isValidVersionDir(versionDir))
             {
                 CorePlugin pluginVersion = createPlugin(pluginRootDir, versionDir);
-                allVersionsForPlugin.add(pluginVersion);
+                File folder = getFolderForPlugin(pluginVersion);
+                if (folder.exists())
+                {
+                    allVersionsForPlugin.add(pluginVersion);
+                }
             } else
             {
                 log.log(LogLevel.WARN, String.format("Invalid version '%s' for plugin '%s'. "
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/ICorePluginResourceLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/ICorePluginResourceLoader.java
similarity index 94%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/ICorePluginResourceLoader.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/ICorePluginResourceLoader.java
index 4ea6ee6974fffd64ed5d9f08ee44b65bfefd7891..0985b901cc09e247f2387da0ea908aa0ff9d8221 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/ICorePluginResourceLoader.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/ICorePluginResourceLoader.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.server.coreplugin;
+package ch.systemsx.cisd.openbis.generic.shared.coreplugin;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CorePlugin;
 
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 1f7217542ab8a70a81ef912de8cf791500010d1a..53d92c077b8f71b70f18a53aac40e277ed0f218c 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
@@ -29,11 +29,11 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
 import ch.systemsx.cisd.common.test.RecordingMatcher;
 import ch.systemsx.cisd.openbis.generic.server.coreplugin.AsCorePluginPaths;
-import ch.systemsx.cisd.openbis.generic.server.coreplugin.ICorePluginResourceLoader;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.IMasterDataScriptRegistrationRunner;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.MasterDataRegistrationException;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.MasterDataTransactionErrors;
 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;
 
 /**
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/CorePluginScannerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginScannerTest.java
similarity index 68%
rename from openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/CorePluginScannerTest.java
rename to openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginScannerTest.java
index e570257034b14d738e12e75365960d5daace0406..74077f5b9a0de086a00e856125f12ec82ec30447 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/coreplugin/CorePluginScannerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginScannerTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.server.coreplugin;
+package ch.systemsx.cisd.openbis.generic.shared.coreplugin;
 
 import java.io.File;
 import java.io.FileFilter;
@@ -28,8 +28,10 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
 import ch.systemsx.cisd.common.logging.MockLogger;
-import ch.systemsx.cisd.openbis.generic.server.coreplugin.CorePluginScanner.ScannerType;
+import ch.systemsx.cisd.openbis.generic.server.coreplugin.AsCorePluginPaths;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CorePlugin;
+import ch.systemsx.cisd.openbis.generic.shared.coreplugin.CorePluginScanner;
+import ch.systemsx.cisd.openbis.generic.shared.coreplugin.CorePluginScanner.ScannerType;
 
 /**
  * @author Kaloyan Enimanev
@@ -39,7 +41,7 @@ public class CorePluginScannerTest extends AbstractFileSystemTestCase
     private final String CORE_PLUGINS_DIR = "../openbis/resource/test-data/core-plugins";
 
     @Test
-    public void testWithRealFolder() throws IOException
+    public void testWithRealFolderScannerTypeAS() throws IOException
     {
         MockLogger logger = new MockLogger();
         File pluginsDir = preparePluginsDirectory(CORE_PLUGINS_DIR);
@@ -69,6 +71,35 @@ public class CorePluginScannerTest extends AbstractFileSystemTestCase
         assertEquals(output, logger.toString());
     }
 
+    @Test
+    public void testWithRealFolderScannerTypeDSS() throws IOException
+    {
+        MockLogger logger = new MockLogger();
+        File pluginsDir = preparePluginsDirectory(CORE_PLUGINS_DIR);
+        CorePluginScanner scanner =
+                new CorePluginScanner(pluginsDir.getAbsolutePath(), ScannerType.DSS, logger);
+
+        List<CorePlugin> plugins = scanner.scanForPlugins();
+        Collections.sort(plugins);
+
+        assertEquals(2, plugins.size());
+
+        CorePlugin plugin = plugins.get(0);
+        assertEquals("plugin-X", plugin.getName());
+        assertEquals(17, plugin.getVersion());
+
+        plugin = plugins.get(1);
+        assertEquals("plugin-Y", plugin.getName());
+        assertEquals(2, plugin.getVersion());
+
+        String output =
+                String.format(
+                        "WARN: No valid versions have been detected for plugin '%s/invalid-folder'.\n"
+                                + "WARN: Invalid version 'NaN-version' for plugin '%s/plugin-X'. Plugin version must be non-negative integer numbers.\n",
+                        pluginsDir.getAbsolutePath(), pluginsDir.getAbsolutePath());
+        assertEquals(output, logger.toString());
+    }
+
     private File preparePluginsDirectory(String originalPath) throws IOException
     {
         File originalDir = new File(originalPath);