diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IMaintenanceTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IMaintenanceTask.java
index 99e883737b0b39fe084a32dd1eb7ae10dbb51ec6..5506be5bc9626a6658c415d29f869844c8fbb6ce 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IMaintenanceTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IMaintenanceTask.java
@@ -19,24 +19,24 @@ package ch.systemsx.cisd.etlserver;
 import java.util.Properties;
 
 /**
- * The interface that should be implemented by all maintenance tasks.
+ * The interface that should be implemented by all maintenance tasks. Task instances are reusable.
  * 
  * @author Izabela Adamczyk
  */
 public interface IMaintenanceTask
 {
-
-    /**
-     * Performs the maintenance task.
-     */
-    public void execute();
-
     /**
-     * Prepares the task for execution and checks that it has been configured correctly.
+     * Prepares the task for execution and checks that it has been configured correctly. It will be
+     * called exactly once immediately after the task is created.
      * 
      * @param pluginName Name of the plugin. Useful for creating messages.
-     * @param properties Properties to set up the task. 
+     * @param properties Properties to set up the task.
      */
     public void setUp(String pluginName, Properties properties);
 
+    /**
+     * Performs the maintenance task. This method is reusable - it will be called many times every
+     * certain time period.
+     */
+    public void execute();
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java
index 9c870437eced6aeb77b1e9413f4f7af855de8b25..9da7146a77e8571f779809b53f47f643763d043e 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java
@@ -9,9 +9,9 @@ import ch.systemsx.cisd.common.utilities.ClassUtils;
 
 public class MaintenancePlugin
 {
-    IMaintenanceTask task;
+    private final IMaintenanceTask task;
 
-    MaintenanceTaskParameters parameters;
+    private final MaintenanceTaskParameters parameters;
 
     public MaintenancePlugin(MaintenanceTaskParameters parameters)
     {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DataSetDeletionMaintenanceTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DataSetDeletionMaintenanceTask.java
index 240d423deaa0985d623d2504d537916f02c66b45..7905191229e9c643ad33f61ea2991b002de0a4ec 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DataSetDeletionMaintenanceTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DataSetDeletionMaintenanceTask.java
@@ -22,6 +22,8 @@ import java.sql.SQLException;
 import java.util.List;
 import java.util.Properties;
 
+import javax.sql.DataSource;
+
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.log4j.Logger;
 
@@ -58,7 +60,7 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask
     private static final String DATABASE_ENGINE_KEY = "database.engine";
 
     private static final String DEFAULT_DATABASE_ENGINE = "postgresql";
-    
+
     private static final String DEFAULT_DATA_SET_PERM_ID = "PERM_ID";
 
     private static final String DATA_SET_PERM_ID_KEY = "data-set-perm-id";
@@ -80,9 +82,7 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask
 
     private final IEncapsulatedOpenBISService openBISService;
 
-    private DatabaseConfigurationContext context;
-
-    private Connection connection;
+    private DataSource dataSource;
 
     private String synchronizationTable;
 
@@ -107,8 +107,9 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask
         dataSetTableName =
                 properties.getProperty(DATA_SET_TABLE_NAME_KEY, DEFAULT_DATA_SET_TABLE_NAME);
         permIDColumn = properties.getProperty(DATA_SET_PERM_ID_KEY, DEFAULT_DATA_SET_PERM_ID);
-        context = createDatabaseConfigurationContext(properties);
+        DatabaseConfigurationContext context = createDatabaseConfigurationContext(properties);
         init(context);
+        this.dataSource = context.getDataSource();
         checkDatabseConnection();
         operationLog.info("Plugin initialized: " + pluginName);
     }
@@ -149,29 +150,33 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask
      */
     protected void init(DatabaseConfigurationContext databaseConfigurationContext)
     {
-        
+
     }
 
     private void checkDatabseConnection()
     {
+        Connection connection = null;
         try
         {
-            connection = context.getDataSource().getConnection();
-            tryGetPreviousLastSeenEventId();
-            connection.close();
+            connection = createConnection();
+            tryGetPreviousLastSeenEventId(connection);
         } catch (SQLException ex)
         {
             throw new ConfigurationFailureException("Initialization failed", ex);
+        } finally
+        {
+            closeConnection(connection);
         }
     }
 
     public void execute()
     {
         operationLog.info("Synchronizing data set information");
+        Connection connection = null;
         try
         {
-            connection = context.getDataSource().getConnection();
-            Long lastSeenEventId = tryGetPreviousLastSeenEventId();
+            connection = createConnection();
+            Long lastSeenEventId = tryGetPreviousLastSeenEventId(connection);
             List<DeletedDataSet> deletedDataSets =
                     openBISService.listDeletedDataSets(lastSeenEventId);
             if (deletedDataSets.size() > 0)
@@ -179,32 +184,55 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask
                 boolean autoCommit = connection.getAutoCommit();
                 connection.setAutoCommit(false);
                 long t0 = System.currentTimeMillis();
-                deleteDatasets(deletedDataSets);
-                updateSynchronizationDate(lastSeenEventId, deletedDataSets);
+                deleteDatasets(deletedDataSets, connection);
+                updateSynchronizationDate(lastSeenEventId, deletedDataSets, connection);
                 connection.commit();
                 operationLog.info("Synchronization task took "
                         + ((System.currentTimeMillis() - t0 + 500) / 1000) + " seconds.");
                 connection.setAutoCommit(autoCommit);
             }
-            connection.close();
         } catch (SQLException ex)
         {
             operationLog.error(ex);
+        } finally
+        {
+            closeConnection(connection);
         }
     }
 
-    private void deleteDatasets(List<DeletedDataSet> deletedDataSets) throws SQLException
+    private void closeConnection(Connection connectionOrNull)
     {
-        operationLog.info(String.format(
-                "Synchronizing deletions of %d datasets with the database.",
-                deletedDataSets.size()));
-        connection.createStatement().execute(
-                String.format("DELETE FROM " + dataSetTableName + " WHERE " + permIDColumn + " IN (%s)",
-                        joinIds(deletedDataSets)));
+        if (connectionOrNull != null)
+        {
+            try
+            {
+                connectionOrNull.close();
+            } catch (SQLException ex)
+            {
+                // suppress this exception
+                operationLog.error(ex);
+            }
+        }
+    }
+
+    private Connection createConnection() throws SQLException
+    {
+        return dataSource.getConnection();
     }
 
-    private void updateSynchronizationDate(Long lastSeenEventIdOrNull, List<DeletedDataSet> deleted)
+    private void deleteDatasets(List<DeletedDataSet> deletedDataSets, Connection connection)
             throws SQLException
+    {
+        operationLog.info(String
+                .format("Synchronizing deletions of %d datasets with the database.",
+                        deletedDataSets.size()));
+        connection.createStatement().execute(
+                String.format("DELETE FROM " + dataSetTableName + " WHERE " + permIDColumn
+                        + " IN (%s)", joinIds(deletedDataSets)));
+    }
+
+    private void updateSynchronizationDate(Long lastSeenEventIdOrNull,
+            List<DeletedDataSet> deleted, Connection connection) throws SQLException
     {
         Long maxEventId = lastSeenEventIdOrNull;
         for (DeletedDataSet dds : deleted)
@@ -218,13 +246,13 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask
         if (lastSeenEventIdOrNull == null || maxEventId > lastSeenEventIdOrNull)
         {
             // we store only the last update time, so all the others can be deleted
-            executeSql("delete from " + synchronizationTable);
+            executeSql("delete from " + synchronizationTable, connection);
             executeSql("INSERT INTO " + synchronizationTable + " (" + lastSeenEventID
-                    + ") VALUES('" + maxEventId + "')");
+                    + ") VALUES('" + maxEventId + "')", connection);
         }
     }
 
-    private void executeSql(String sql) throws SQLException
+    private void executeSql(String sql, Connection connection) throws SQLException
     {
         PreparedStatement statement = connection.prepareStatement(sql);
         statement.executeUpdate();
@@ -245,13 +273,13 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask
         return ids;
     }
 
-    private long tryGetPreviousLastSeenEventId() throws SQLException
+    private long tryGetPreviousLastSeenEventId(Connection connection) throws SQLException
     {
         Long maxLastSeenEventId = null;
         ResultSet result =
                 connection.createStatement().executeQuery(
-                        "SELECT MAX(" + lastSeenEventID + ") AS " + lastSeenEventID
-                                + " FROM " + synchronizationTable);
+                        "SELECT MAX(" + lastSeenEventID + ") AS " + lastSeenEventID + " FROM "
+                                + synchronizationTable);
         while (result.next())
         {
             long newLastSeenEventId = result.getLong(lastSeenEventID);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java
index 2d27798abf44d1670a6ccbe9f647642962e07bd2..86869a65c77670d38d44754b25fe4564d5c9dce9 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java
@@ -226,7 +226,7 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic
 
         PluginTaskProvider<IReportingPluginTask> reportingPlugins =
                 pluginTaskParameters.getReportingPluginsProvider();
-        IReportingPluginTask task = reportingPlugins.createPluginInstance(serviceKey, storeRoot);
+        IReportingPluginTask task = reportingPlugins.getPluginInstance(serviceKey);
         return task.createReport(datasets);
     }
 
@@ -238,7 +238,7 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic
         PluginTaskProvider<IProcessingPluginTask> plugins =
                 pluginTaskParameters.getProcessingPluginsProvider();
 
-        IProcessingPluginTask task = plugins.createPluginInstance(serviceKey, storeRoot);
+        IProcessingPluginTask task = plugins.getPluginInstance(serviceKey);
         DatastoreServiceDescription pluginDescription = plugins.getPluginDescription(serviceKey);
         commandExecutor.scheduleProcessDatasets(task, datasets, userEmailOrNull, pluginDescription,
                 mailClientParameters);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/AbstractPluginTaskFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/AbstractPluginTaskFactory.java
index 99f056f9cd12164160aa98c7883a70c9d3f75d93..1ff38b6506f7828b36276f141f69815c1bef7349 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/AbstractPluginTaskFactory.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/AbstractPluginTaskFactory.java
@@ -47,13 +47,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescrip
  */
 public abstract class AbstractPluginTaskFactory<T>
 {
-    /**
-     * Creates a new instance of a plugin task
-     * 
-     * @param storeRoot the root directory of the file store
-     */
-    abstract public T createPluginInstance(File storeRoot);
-
     /**
      * Logs the current parameters to the {@link LogCategory#OPERATION} log.
      */
@@ -87,7 +80,10 @@ public abstract class AbstractPluginTaskFactory<T>
 
     private final Properties instanceParameters;
 
-    protected AbstractPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode)
+    private final T pluginInstance;
+
+    protected AbstractPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode,
+            Class<T> clazz, File storeRoot)
     {
         Properties pluginProperties = sectionProperties.getProperties();
         String pluginKey = sectionProperties.getKey();
@@ -97,9 +93,18 @@ public abstract class AbstractPluginTaskFactory<T>
                 new DatastoreServiceDescription(pluginKey, label, datasetCodes, datastoreCode);
         this.className = PropertyUtils.getMandatoryProperty(pluginProperties, CLASS_PROPERTY_NAME);
         this.instanceParameters = extractInstanceParameters(pluginProperties);
+        this.pluginInstance = createPluginInstance(clazz, storeRoot);
+    }
+
+    /**
+     * Returns an instance of a plugin task
+     */
+    public T getPluginInstance()
+    {
+        return pluginInstance;
     }
 
-    protected T createPluginInstance(Class<T> clazz, File storeRoot)
+    private T createPluginInstance(Class<T> clazz, File storeRoot)
     {
         try
         {
@@ -170,14 +175,13 @@ public abstract class AbstractPluginTaskFactory<T>
      */
     public void check(boolean checkIfSerializable)
     {
-        T pluginInstance = createPluginInstance(new File(".")); // just to see if it is possible
         if (checkIfSerializable)
         {
-            checkInstanceSerializable(pluginInstance);
+            checkInstanceSerializable();
         }
     }
 
-    private void checkInstanceSerializable(T pluginInstance)
+    private void checkInstanceSerializable()
     {
         try
         {
@@ -191,12 +195,12 @@ public abstract class AbstractPluginTaskFactory<T>
             in.readObject(); // read the object back
         } catch (Exception ex)
         {
-            throwSerializationError(pluginInstance, ex.getMessage());
+            throwSerializationError(ex.getMessage());
         }
 
     }
 
-    private void throwSerializationError(T pluginInstance, String message)
+    private void throwSerializationError(String message)
     {
         throw UserFailureException.fromTemplate(
                 "Plugin '%s' has problems with serialization/deserialization: %s", pluginInstance
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IProcessingPluginTask.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IProcessingPluginTask.java
index 6bcbcf8c376f463b41a288e6cdc6e1d8ae6fb0f4..5a38089dd32d0bdd94bbf691ae54e94bd3af40b4 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IProcessingPluginTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IProcessingPluginTask.java
@@ -22,7 +22,8 @@ import java.util.List;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
 /**
- * Interface of the processing plugin task.
+ * Interface of the processing plugin task. Implementations will be singletons serving all the
+ * requests.
  * 
  * @author Tomasz Pylak
  */
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IReportingPluginTask.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IReportingPluginTask.java
index 413584ecbb3a019fd3d8759103e2fc50e5771811..61ea4952e8024f0ac7c8a30013bad44a5e0b578c 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IReportingPluginTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IReportingPluginTask.java
@@ -22,14 +22,15 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
 /**
- * Interface of the reporting plugin task.
+ * Interface of the reporting plugin task. Implementations will be singletons serving all the
+ * requests.
  * 
  * @author Tomasz Pylak
  */
 public interface IReportingPluginTask
 {
     /**
-     * Creates a report for the specified datasets
+     * Creates a report for the specified datasets. This method should be multi threaded.
      */
     TableModel createReport(List<DatasetDescription> datasets);
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProvider.java
index 28537f048966ba11376462d0a468d7355d4d02e1..0d80c7d6a62278d0e80319146a96a870eba76974 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProvider.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProvider.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -47,10 +46,12 @@ public class PluginTaskProvider<P>
                             });
     }
 
-    /** creates an instance of the plugin with the given key */
-    public P createPluginInstance(String pluginKey, File storeRoot)
+    /**
+     * returns an instance of the plugin with the given key
+     */
+    public P getPluginInstance(String pluginKey)
     {
-        return getFactory(pluginKey).createPluginInstance(storeRoot);
+        return getFactory(pluginKey).getPluginInstance();
     }
 
     public DatastoreServiceDescription getPluginDescription(String pluginKey)
@@ -97,4 +98,3 @@ public class PluginTaskProvider<P>
         return factory;
     }
 }
-
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProviders.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProviders.java
index c7751e18df7a68dde2241f54ca49c6695243e46c..b86119161de5790cd32a53946c60d4288c5c6f0c 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProviders.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProviders.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks;
 
+import java.io.File;
 import java.util.Properties;
 
 import ch.rinn.restrictions.Private;
@@ -47,10 +48,10 @@ public class PluginTaskProviders
     private final ArchiverTaskFactory archiverTaskFactory;
 
     /** for external injections */
-    public static PluginTaskProviders create()
+    public static PluginTaskProviders create(File storeRoot)
     {
         Properties properties = PropertyParametersUtil.loadServiceProperties();
-        PluginTaskProviders providers = new PluginTaskProviders(properties);
+        PluginTaskProviders providers = new PluginTaskProviders(properties, storeRoot);
         providers.check();
         providers.logConfigurations();
         return providers;
@@ -58,11 +59,13 @@ public class PluginTaskProviders
 
     @Private
     // public only for tests
-    public PluginTaskProviders(Properties serviceProperties)
+    public PluginTaskProviders(Properties serviceProperties, File storeRoot)
     {
         String datastoreCode = PropertyParametersUtil.getDataStoreCode(serviceProperties);
-        this.reportingPlugins = createReportingPluginsFactories(serviceProperties, datastoreCode);
-        this.processingPlugins = createProcessingPluginsFactories(serviceProperties, datastoreCode);
+        this.reportingPlugins =
+                createReportingPluginsFactories(serviceProperties, datastoreCode, storeRoot);
+        this.processingPlugins =
+                createProcessingPluginsFactories(serviceProperties, datastoreCode, storeRoot);
         this.archiverTaskFactory = createArchiverTaskFactory(serviceProperties, datastoreCode);
     }
 
@@ -96,7 +99,7 @@ public class PluginTaskProviders
 
     @Private
     static PluginTaskProvider<IReportingPluginTask> createReportingPluginsFactories(
-            Properties serviceProperties, String datastoreCode)
+            Properties serviceProperties, String datastoreCode, File storeRoot)
     {
         SectionProperties[] sectionsProperties =
                 extractSectionProperties(serviceProperties, REPORTING_PLUGIN_NAMES);
@@ -104,14 +107,15 @@ public class PluginTaskProviders
                 new ReportingPluginTaskFactory[sectionsProperties.length];
         for (int i = 0; i < factories.length; i++)
         {
-            factories[i] = new ReportingPluginTaskFactory(sectionsProperties[i], datastoreCode);
+            factories[i] =
+                    new ReportingPluginTaskFactory(sectionsProperties[i], datastoreCode, storeRoot);
         }
         return new PluginTaskProvider<IReportingPluginTask>(factories);
     }
 
     @Private
     static PluginTaskProvider<IProcessingPluginTask> createProcessingPluginsFactories(
-            Properties serviceProperties, String datastoreCode)
+            Properties serviceProperties, String datastoreCode, File storeRoot)
     {
         SectionProperties[] sectionsProperties =
                 extractSectionProperties(serviceProperties, PROCESSING_PLUGIN_NAMES);
@@ -119,7 +123,8 @@ public class PluginTaskProviders
                 new ProcessingPluginTaskFactory[sectionsProperties.length];
         for (int i = 0; i < factories.length; i++)
         {
-            factories[i] = new ProcessingPluginTaskFactory(sectionsProperties[i], datastoreCode);
+            factories[i] =
+                    new ProcessingPluginTaskFactory(sectionsProperties[i], datastoreCode, storeRoot);
         }
         return new PluginTaskProvider<IProcessingPluginTask>(factories);
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ProcessingPluginTaskFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ProcessingPluginTaskFactory.java
index 7624d73e9aa4d151d9087c28e694d893e54afa70..3a570b3d21106805bd4281dc311bfefe369f0ac4 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ProcessingPluginTaskFactory.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ProcessingPluginTaskFactory.java
@@ -34,15 +34,10 @@ public class ProcessingPluginTaskFactory extends AbstractPluginTaskFactory<IProc
     private static final Logger operationLog =
             LogFactory.getLogger(LogCategory.OPERATION, ProcessingPluginTaskFactory.class);
 
-    public ProcessingPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode)
+    public ProcessingPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode,
+            File storeRoot)
     {
-        super(sectionProperties, datastoreCode);
-    }
-
-    @Override
-    public IProcessingPluginTask createPluginInstance(File storeRoot)
-    {
-        return createPluginInstance(IProcessingPluginTask.class, storeRoot);
+        super(sectionProperties, datastoreCode, IProcessingPluginTask.class, storeRoot);
     }
 
     @Override
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ReportingPluginTaskFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ReportingPluginTaskFactory.java
index c53fe66052a9c83b0737fca7fda642b40869fb62..468e541fe3c5ada649101ec2757522d711c208bb 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ReportingPluginTaskFactory.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ReportingPluginTaskFactory.java
@@ -34,15 +34,10 @@ public class ReportingPluginTaskFactory extends AbstractPluginTaskFactory<IRepor
     private static final Logger operationLog =
             LogFactory.getLogger(LogCategory.OPERATION, ProcessingPluginTaskFactory.class);
 
-    public ReportingPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode)
+    public ReportingPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode,
+            File storeRoot)
     {
-        super(sectionProperties, datastoreCode);
-    }
-
-    @Override
-    public IReportingPluginTask createPluginInstance(File storeRoot)
-    {
-        return createPluginInstance(IReportingPluginTask.class, storeRoot);
+        super(sectionProperties, datastoreCode, IReportingPluginTask.class, storeRoot);
     }
 
     @Override
diff --git a/datastore_server/source/java/dssApplicationContext.xml b/datastore_server/source/java/dssApplicationContext.xml
index 38516a6d53eb579be6ad7a259b4fee7696cbfa14..c394f4281a789b1945fe3903a1c6d9cfbbb17a60 100644
--- a/datastore_server/source/java/dssApplicationContext.xml
+++ b/datastore_server/source/java/dssApplicationContext.xml
@@ -18,8 +18,9 @@
         <property name="ignoreUnresolvablePlaceholders" value="true" />
     </bean>
     
-    <bean id="plugin-tasks" class="ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.PluginTaskProviders" factory-method="create" />
-
+    <bean id="plugin-tasks" class="ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.PluginTaskProviders" factory-method="create" >
+      <constructor-arg value="${storeroot-dir}" />
+    </bean>
 
     <bean id="openBIS-service" class="ch.systemsx.cisd.openbis.dss.generic.server.EncapsulatedOpenBISService">
         <constructor-arg ref="session-token-manager"/>
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
index fc334cf8f289300a55a0148a939ce59c53f069d4..90f42d60ad166a78c8a4c6b30ebf132b5f4a4f2c 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
@@ -249,7 +249,8 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC
         final Properties properties = new Properties();
         properties.setProperty(JavaMailProperties.MAIL_SMTP_HOST, "host");
         properties.setProperty(JavaMailProperties.MAIL_FROM, "me");
-        properties.setProperty(ETLDaemon.STOREROOT_DIR_KEY, workingDirectory.getPath());
+        String storeRoot = workingDirectory.getPath();
+        properties.setProperty(ETLDaemon.STOREROOT_DIR_KEY, storeRoot);
         storageProcessor = context.mock(IStorageProcessor.class);
         limsService = context.mock(IETLLIMSService.class);
         mailClient = context.mock(IMailClient.class);
@@ -258,7 +259,7 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC
                         typeExtractor, storageProcessor);
         final EncapsulatedOpenBISService authorizedLimsService =
                 new EncapsulatedOpenBISService(new SessionTokenManager(), limsService,
-                        PluginUtilTest.createPluginTaskProviders());
+                        PluginUtilTest.createPluginTaskProviders(new File(storeRoot)));
         authorizedLimsService.setUsername("u");
         authorizedLimsService.setPassword("p");
         dataSetValidator = context.mock(IDataSetValidator.class);
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java
index 0818805e462365e76544ed544648d73d8f3ca7c6..2ca94255804c49a3d7f7930af9f6b4f4d78ec776 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java
@@ -111,7 +111,7 @@ public class DataStoreServiceTest extends AssertJUnit
         mailClientParameters.setFrom("a@bc.de");
         mailClientParameters.setSmtpHost("file://targets/email");
         FileUtilities.deleteRecursively(TEST_FOLDER);
-        pluginTaskParameters = PluginUtilTest.createPluginTaskProviders();
+        pluginTaskParameters = PluginUtilTest.createPluginTaskProviders(TEST_STORE);
         TEST_STORE.mkdirs();
     }
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java
index 159b29ea54d049bd31a7e32666f2315d9e738098..18eca0705785c8f91c40b9e24a44baee29255d5a 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.server;
 
+import java.io.File;
+
 import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
 import org.jmock.Expectations;
@@ -123,7 +125,7 @@ public class EncapsulatedOpenBISServiceTest
             });
         encapsulatedLimsService =
                 new EncapsulatedOpenBISService(new SessionTokenManager(), limsService,
-                        PluginUtilTest.createPluginTaskProviders());
+                        PluginUtilTest.createPluginTaskProviders(new File(".")));
         encapsulatedLimsService.setUsername(LIMS_USER);
         encapsulatedLimsService.setPassword(LIMS_PASSWORD);
         encapsulatedLimsService.setDataStoreCode(DATA_STORE_CODE);
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java
index 90dc5c94217bf1f7cc874daca850d670028124f3..b2034178d8811a7c1df28798f7ef172b9d9f0eb4 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java
@@ -66,9 +66,8 @@ public class PluginTaskParametersTest extends AbstractFileSystemTestCase
         PluginTaskProvider<IReportingPluginTask> factories = createReportingPluginsFactories(props);
         factories.check(false);
         factories.logConfigurations();
-        IReportingPluginTask pluginInstance1 = factories.createPluginInstance(plugin1, STORE_ROOT);
+        IReportingPluginTask pluginInstance1 = factories.getPluginInstance(plugin1);
         pluginInstance1.createReport(createDatasetDescriptions());
-        factories.createPluginInstance(plugin2, STORE_ROOT);
 
         List<DatastoreServiceDescription> descriptions = factories.getPluginDescriptions();
         assertEquals(2, descriptions.size());
@@ -98,13 +97,13 @@ public class PluginTaskParametersTest extends AbstractFileSystemTestCase
     private static PluginTaskProvider<IReportingPluginTask> createReportingPluginsFactories(
             Properties props)
     {
-        return PluginTaskProviders.createReportingPluginsFactories(props, "dss");
+        return PluginTaskProviders.createReportingPluginsFactories(props, "dss", STORE_ROOT);
     }
 
     private static PluginTaskProvider<IProcessingPluginTask> createProcessingPluginsFactories(
             Properties props)
     {
-        return PluginTaskProviders.createProcessingPluginsFactories(props, "dss");
+        return PluginTaskProviders.createProcessingPluginsFactories(props, "dss", STORE_ROOT);
     }
 
     @Test
@@ -135,7 +134,7 @@ public class PluginTaskParametersTest extends AbstractFileSystemTestCase
                 createProcessingPluginsFactories(props);
         factories.check(true);
         factories.logConfigurations();
-        IProcessingPluginTask pluginInstance1 = factories.createPluginInstance(plugin1, STORE_ROOT);
+        IProcessingPluginTask pluginInstance1 = factories.getPluginInstance(plugin1);
         pluginInstance1.process(createDatasetDescriptions());
     }
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/PluginUtilTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/PluginUtilTest.java
index 8645bf32bccd79cb7f9850bbfbb3d910ca91a7bb..7d7e69df91f98d97c2cc94f5f0d9740d1f41e4f1 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/PluginUtilTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/PluginUtilTest.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.shared.utils;
 
+import java.io.File;
 import java.util.Properties;
 
 import ch.rinn.restrictions.Friend;
@@ -27,10 +28,10 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.PluginTaskProvi
 @Friend(toClasses = PropertyParametersUtil.class)
 public class PluginUtilTest
 {
-    public static PluginTaskProviders createPluginTaskProviders()
+    public static PluginTaskProviders createPluginTaskProviders(File storeRoot)
     {
         Properties serviceProperties = new Properties();
         serviceProperties.put(PropertyParametersUtil.DSS_CODE_KEY, "dss");
-        return new PluginTaskProviders(serviceProperties);
+        return new PluginTaskProviders(serviceProperties, storeRoot);
     }
 }
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/AbstractEICMLDatastoreReportingPlugin.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/AbstractEICMLDatastoreReportingPlugin.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2cc1edbd774369392928ff3f2ff868f276730a4
--- /dev/null
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/AbstractEICMLDatastoreReportingPlugin.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 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.yeastx.eicml;
+
+import java.io.File;
+import java.util.List;
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+import net.lemnik.eodsql.QueryTool;
+
+import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
+import ch.systemsx.cisd.yeastx.db.DBUtils;
+
+/**
+ * Abstract superclass for reporting plugins operating on the metabol database.
+ * 
+ * @author Tomasz Pylak
+ */
+abstract public class AbstractEICMLDatastoreReportingPlugin extends AbstractDatastorePlugin
+        implements IReportingPluginTask
+{
+    private static final long serialVersionUID = 1L;
+
+    /** creates a report for specified datasets using a given DAO. */
+    abstract protected TableModel createReport(List<DatasetDescription> datasets, IEICMSRunDAO query);
+
+    private final DataSource dataSource;
+
+    public AbstractEICMLDatastoreReportingPlugin(Properties properties, File storeRoot)
+    {
+        super(properties, storeRoot);
+        final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties);
+        this.dataSource = dbContext.getDataSource();
+    }
+
+    private IEICMSRunDAO createQuery()
+    {
+        return QueryTool.getQuery(dataSource, IEICMSRunDAO.class);
+    }
+
+    public TableModel createReport(List<DatasetDescription> datasets)
+    {
+        IEICMSRunDAO query = createQuery();
+        try
+        {
+            return createReport(datasets, query);
+        } finally
+        {
+            query.close();
+        }
+    }
+}
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java
index b698d2718ac728af2f5b28b7c2f00049248960a3..76b6f0bd65439d8e04a79b1a568e90bab04a4912 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java
@@ -23,15 +23,9 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.Properties;
 
-import javax.sql.DataSource;
-
 import net.lemnik.eodsql.DataIterator;
-import net.lemnik.eodsql.QueryTool;
 
 import ch.rinn.restrictions.Private;
-import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
-import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin;
-import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder;
 import ch.systemsx.cisd.openbis.dss.yeastx.server.EICMLChromatogramGeneratorServlet;
 import ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants;
@@ -40,18 +34,16 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
-import ch.systemsx.cisd.yeastx.db.DBUtils;
 
 /**
  * Reporting plugin which shows images for the chromatograms contained in the specified datasets.
  * 
  * @author Chandrasekhar Ramakrishnan
  */
-public class EICMLChromatogramImagesReporter extends AbstractDatastorePlugin implements
-        IReportingPluginTask
+public class EICMLChromatogramImagesReporter extends AbstractEICMLDatastoreReportingPlugin
 {
     private static final String CHROMATOGRAM_SERVLET = "chromatogram";
-    
+
     private static final int MZ_1_COLUMN_INDEX = 1;
 
     private static final int THUMBNAIL_WIDTH = 300;
@@ -64,8 +56,6 @@ public class EICMLChromatogramImagesReporter extends AbstractDatastorePlugin imp
 
     private static final long serialVersionUID = 1L;
 
-    private final IEICMSRunDAO query;
-
     /**
      * An internal helper class for storing the information for the query parameters to the image
      * servlet.
@@ -110,21 +100,14 @@ public class EICMLChromatogramImagesReporter extends AbstractDatastorePlugin imp
     public EICMLChromatogramImagesReporter(Properties properties, File storeRoot)
     {
         super(properties, storeRoot);
-        this.query = createQuery(properties);
-    }
-
-    private static IEICMSRunDAO createQuery(Properties properties)
-    {
-        final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties);
-        DataSource dataSource = dbContext.getDataSource();
-        return QueryTool.getQuery(dataSource, IEICMSRunDAO.class);
     }
 
-    public TableModel createReport(List<DatasetDescription> datasets)
+    @Override
+    protected final TableModel createReport(List<DatasetDescription> datasets, IEICMSRunDAO query)
     {
         SimpleTableModelBuilder builder = new SimpleTableModelBuilder();
         addReportHeaders(builder);
-        List<DatasetRun> runs = fetchRuns(datasets);
+        List<DatasetRun> runs = fetchRuns(datasets, query);
         for (DatasetRun datasetRun : runs)
         {
             DataIterator<ChromatogramDTO> chromatograms =
@@ -146,7 +129,7 @@ public class EICMLChromatogramImagesReporter extends AbstractDatastorePlugin imp
         return tableModel;
     }
 
-    private List<DatasetRun> fetchRuns(List<DatasetDescription> datasets)
+    private List<DatasetRun> fetchRuns(List<DatasetDescription> datasets, IEICMSRunDAO query)
     {
         List<DatasetRun> runs = new ArrayList<DatasetRun>();
         for (DatasetDescription dataset : datasets)
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java
index 868e46872c2d204029e42a0292ae6bcb35d51ca2..8785555b1c3a27061aab16b1b658c8c67573e8ae 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java
@@ -24,50 +24,33 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 
-import javax.sql.DataSource;
-
 import net.lemnik.eodsql.DataIterator;
-import net.lemnik.eodsql.QueryTool;
 
-import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
-import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin;
-import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
-import ch.systemsx.cisd.yeastx.db.DBUtils;
 
 /**
  * Reporting plugin which shows all the chromatograms details for the chosen datasets.
  * 
  * @author Tomasz Pylak
  */
-public class EICMLChromatogramsReporter extends AbstractDatastorePlugin implements
-        IReportingPluginTask
+public class EICMLChromatogramsReporter extends AbstractEICMLDatastoreReportingPlugin
 {
-    private final IEICMSRunDAO query;
+    private static final long serialVersionUID = 1L;
 
     public EICMLChromatogramsReporter(Properties properties, File storeRoot)
     {
         super(properties, storeRoot);
-        this.query = createQuery(properties);
     }
 
-    private static IEICMSRunDAO createQuery(Properties properties)
-    {
-        final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties);
-        DataSource dataSource = dbContext.getDataSource();
-        return QueryTool.getQuery(dataSource, IEICMSRunDAO.class);
-    }
-
-    private static final long serialVersionUID = 1L;
-
-    public TableModel createReport(List<DatasetDescription> datasets)
+    @Override
+    protected final TableModel createReport(List<DatasetDescription> datasets, IEICMSRunDAO query)
     {
         SimpleTableModelBuilder builder = new SimpleTableModelBuilder();
         addReportHeaders(builder);
-        List<EICMSRunDTO> runs = fetchRuns(datasets);
+        List<EICMSRunDTO> runs = fetchRuns(datasets, query);
         for (EICMSRunDTO run : runs)
         {
             DataIterator<ChromatogramDTO> chromatograms = query.getChromatogramsForRun(run);
@@ -76,7 +59,7 @@ public class EICMLChromatogramsReporter extends AbstractDatastorePlugin implemen
         return builder.getTableModel();
     }
 
-    private List<EICMSRunDTO> fetchRuns(List<DatasetDescription> datasets)
+    private List<EICMSRunDTO> fetchRuns(List<DatasetDescription> datasets, IEICMSRunDAO query)
     {
         List<EICMSRunDTO> runs = new ArrayList<EICMSRunDTO>();
         for (DatasetDescription dataset : datasets)
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java
index b55d1828b71ef0d77d6a399385ee98c1110a2b87..69f0cef0de663efe9079c23e7b792e0749d0cc57 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java
@@ -24,44 +24,27 @@ import java.util.Date;
 import java.util.List;
 import java.util.Properties;
 
-import javax.sql.DataSource;
-
-import net.lemnik.eodsql.QueryTool;
-
-import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
-import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin;
-import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
-import ch.systemsx.cisd.yeastx.db.DBUtils;
 
 /**
  * Reporting plugin which shows all the run details for the chosen datasets.
  * 
  * @author Tomasz Pylak
  */
-public class EICMLRunsReporter extends AbstractDatastorePlugin implements IReportingPluginTask
+public class EICMLRunsReporter extends AbstractEICMLDatastoreReportingPlugin 
 {
-    private final IEICMSRunDAO query;
+    private static final long serialVersionUID = 1L;
 
     public EICMLRunsReporter(Properties properties, File storeRoot)
     {
         super(properties, storeRoot);
-        this.query = createQuery(properties);
-    }
-
-    private static IEICMSRunDAO createQuery(Properties properties)
-    {
-        final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties);
-        DataSource dataSource = dbContext.getDataSource();
-        return QueryTool.getQuery(dataSource, IEICMSRunDAO.class);
     }
 
-    private static final long serialVersionUID = 1L;
-
-    public TableModel createReport(List<DatasetDescription> datasets)
+    @Override
+    protected final TableModel createReport(List<DatasetDescription> datasets, IEICMSRunDAO query)
     {
         SimpleTableModelBuilder builder = new SimpleTableModelBuilder();
         addReportHeaders(builder);