diff --git a/js-test/servers/dsu/core-plugins/core-plugins.properties b/js-test/servers/dsu/core-plugins/core-plugins.properties
new file mode 100644
index 0000000000000000000000000000000000000000..d57d5635dd708d303fa1d4e6749fdd657b6904f8
--- /dev/null
+++ b/js-test/servers/dsu/core-plugins/core-plugins.properties
@@ -0,0 +1,2 @@
+
+enabled-modules = downloader, illumina-ngs, laneStatistics, ngs-sample-overview-graph
diff --git a/js-test/servers/dsu/core-plugins/laneStatistics b/js-test/servers/dsu/core-plugins/laneStatistics
new file mode 120000
index 0000000000000000000000000000000000000000..19257e80dbc3336d11fee6332b5501d2a9e3d583
--- /dev/null
+++ b/js-test/servers/dsu/core-plugins/laneStatistics
@@ -0,0 +1 @@
+../../../../deep_sequencing_unit/source/core-plugins/laneStatistics
\ No newline at end of file
diff --git a/js-test/servers/dsu/datastore_server/.activity/default-dropbox b/js-test/servers/dsu/datastore_server/.activity/default-dropbox
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/.shredder b/js-test/servers/dsu/datastore_server/.shredder
new file mode 100644
index 0000000000000000000000000000000000000000..2e08dce276e43c677d121d627a250d1710fed824
Binary files /dev/null and b/js-test/servers/dsu/datastore_server/.shredder differ
diff --git a/js-test/servers/dsu/datastore_server/.updater b/js-test/servers/dsu/datastore_server/.updater
new file mode 100644
index 0000000000000000000000000000000000000000..2e08dce276e43c677d121d627a250d1710fed824
Binary files /dev/null and b/js-test/servers/dsu/datastore_server/.updater differ
diff --git a/js-test/servers/dsu/datastore_server/data/incoming-default/.gitignore b/js-test/servers/dsu/datastore_server/data/incoming-default/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/data/post-registration/cleanup-tasks/.gitignore b/js-test/servers/dsu/datastore_server/data/post-registration/cleanup-tasks/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/data/store/.SHREDDER/.gitignore b/js-test/servers/dsu/datastore_server/data/store/.SHREDDER/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/data/store/1/pre-commit/.gitignore b/js-test/servers/dsu/datastore_server/data/store/1/pre-commit/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/data/store/1/pre-staging/.gitignore b/js-test/servers/dsu/datastore_server/data/store/1/pre-staging/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/data/store/1/recovery-marker/default-dropbox/.gitignore b/js-test/servers/dsu/datastore_server/data/store/1/recovery-marker/default-dropbox/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/data/store/1/staging/.gitignore b/js-test/servers/dsu/datastore_server/data/store/1/staging/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/data/store/commandQueue b/js-test/servers/dsu/datastore_server/data/store/commandQueue
new file mode 100644
index 0000000000000000000000000000000000000000..2e08dce276e43c677d121d627a250d1710fed824
Binary files /dev/null and b/js-test/servers/dsu/datastore_server/data/store/commandQueue differ
diff --git a/js-test/servers/dsu/datastore_server/data/store/deleteDatasetsAlreadyDeletedFromApplicationServerTaskLastSeen b/js-test/servers/dsu/datastore_server/data/store/deleteDatasetsAlreadyDeletedFromApplicationServerTaskLastSeen
new file mode 100644
index 0000000000000000000000000000000000000000..626644fadca1c7471dee803656968e2f72368c58
--- /dev/null
+++ b/js-test/servers/dsu/datastore_server/data/store/deleteDatasetsAlreadyDeletedFromApplicationServerTaskLastSeen
@@ -0,0 +1 @@
+1060
\ No newline at end of file
diff --git a/js-test/servers/dsu/datastore_server/db/pathinfo_test_js_dsu.sql b/js-test/servers/dsu/datastore_server/db/pathinfo_test_js_dsu.sql
new file mode 100644
index 0000000000000000000000000000000000000000..e8d341322b4fee0c8f0ba4a6a00294a3e923528b
--- /dev/null
+++ b/js-test/servers/dsu/datastore_server/db/pathinfo_test_js_dsu.sql
@@ -0,0 +1,322 @@
+--
+-- PostgreSQL database dump
+--
+
+SET statement_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+
+--
+-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -
+--
+
+CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
+
+
+--
+-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -
+--
+
+COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
+
+
+SET search_path = public, pg_catalog;
+
+--
+-- Name: boolean_char; Type: DOMAIN; Schema: public; Owner: -
+--
+
+CREATE DOMAIN boolean_char AS boolean DEFAULT false;
+
+
+--
+-- Name: code; Type: DOMAIN; Schema: public; Owner: -
+--
+
+CREATE DOMAIN code AS character varying(40);
+
+
+--
+-- Name: file_path; Type: DOMAIN; Schema: public; Owner: -
+--
+
+CREATE DOMAIN file_path AS character varying(1000);
+
+
+--
+-- Name: tech_id; Type: DOMAIN; Schema: public; Owner: -
+--
+
+CREATE DOMAIN tech_id AS bigint;
+
+
+--
+-- Name: time_stamp; Type: DOMAIN; Schema: public; Owner: -
+--
+
+CREATE DOMAIN time_stamp AS timestamp with time zone;
+
+
+SET default_tablespace = '';
+
+SET default_with_oids = false;
+
+--
+-- Name: data_set_files; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE data_set_files (
+    id bigint NOT NULL,
+    dase_id tech_id NOT NULL,
+    parent_id tech_id,
+    relative_path file_path NOT NULL,
+    file_name file_path NOT NULL,
+    size_in_bytes bigint NOT NULL,
+    checksum_crc32 integer,
+    is_directory boolean_char NOT NULL,
+    last_modified time_stamp DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: data_set_files_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE data_set_files_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- Name: data_set_files_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE data_set_files_id_seq OWNED BY data_set_files.id;
+
+
+--
+-- Name: data_set_files_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('data_set_files_id_seq', 1, false);
+
+
+--
+-- Name: data_sets; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE data_sets (
+    id bigint NOT NULL,
+    code code NOT NULL,
+    location file_path NOT NULL
+);
+
+
+--
+-- Name: data_sets_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE data_sets_id_seq
+    START WITH 1
+    INCREMENT BY 1
+    NO MINVALUE
+    NO MAXVALUE
+    CACHE 1;
+
+
+--
+-- Name: data_sets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE data_sets_id_seq OWNED BY data_sets.id;
+
+
+--
+-- Name: data_sets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
+--
+
+SELECT pg_catalog.setval('data_sets_id_seq', 1, false);
+
+
+--
+-- Name: database_version_logs; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE database_version_logs (
+    db_version character varying(4) NOT NULL,
+    module_name character varying(250),
+    run_status character varying(10),
+    run_status_timestamp timestamp without time zone,
+    module_code bytea,
+    run_exception bytea
+);
+
+
+--
+-- Name: events; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE events (
+    last_seen_deletion_event_id tech_id NOT NULL
+);
+
+
+--
+-- Name: last_feeding_event; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE last_feeding_event (
+    registration_timestamp time_stamp NOT NULL
+);
+
+
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE data_set_files ALTER COLUMN id SET DEFAULT nextval('data_set_files_id_seq'::regclass);
+
+
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE data_sets ALTER COLUMN id SET DEFAULT nextval('data_sets_id_seq'::regclass);
+
+
+--
+-- Data for Name: data_set_files; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY data_set_files (id, dase_id, parent_id, relative_path, file_name, size_in_bytes, checksum_crc32, is_directory, last_modified) FROM stdin;
+\.
+
+
+--
+-- Data for Name: data_sets; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY data_sets (id, code, location) FROM stdin;
+\.
+
+
+--
+-- Data for Name: database_version_logs; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY database_version_logs (db_version, module_name, run_status, run_status_timestamp, module_code, run_exception) FROM stdin;
+005	../datastore_server/source/sql/postgresql/005/schema-005.sql	SUCCESS	2013-02-13 13:23:07.049	\\x0a2f2a202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202a2f0a2f2a20446f6d61696e73202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202a2f0a2f2a202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202a2f0a0a43524541544520444f4d41494e20544543485f494420415320424947494e543b0a0a43524541544520444f4d41494e20434f44452041532056415243484152283430293b0a0a43524541544520444f4d41494e2046494c455f5041544820415320564152434841522831303030293b0a0a43524541544520444f4d41494e20424f4f4c45414e5f4348415220415320424f4f4c45414e2044454641554c542046414c53453b0a0a43524541544520444f4d41494e2054494d455f5354414d502041532054494d455354414d5020574954482054494d45205a4f4e453b0a0a0a2f2a202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202a2f0a2f2a205461626c657320202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202a2f0a2f2a202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202a2f0a0a435245415445205441424c4520444154415f5345545320280a202049442042494753455249414c204e4f54204e554c4c2c0a2020434f444520434f4445204e4f54204e554c4c2c0a20204c4f434154494f4e2046494c455f50415448204e4f54204e554c4c2c0a0a20205052494d415259204b455920284944292c0a2020554e495155452028434f4445290a293b0a0a43524541544520494e44455820444154415f534554535f434f44455f494458204f4e20444154415f534554532028434f4445293b0a0a435245415445205441424c4520444154415f5345545f46494c455320280a202049442042494753455249414c204e4f54204e554c4c2c0a2020444153455f494420544543485f4944204e4f54204e554c4c2c0a2020504152454e545f494420544543485f49442c0a202052454c41544956455f504154482046494c455f50415448204e4f54204e554c4c2c0a202046494c455f4e414d452046494c455f50415448204e4f54204e554c4c2c0a202053495a455f494e5f425954455320424947494e54204e4f54204e554c4c2c0a2020434845434b53554d5f435243333220494e54454745522c0a202049535f4449524543544f525920424f4f4c45414e5f43484152204e4f54204e554c4c2c0a20204c4153545f4d4f4449464945442054494d455f5354414d50204e4f54204e554c4c2044454641554c54204e4f5728292c0a0a20205052494d415259204b455920284944292c0a2020434f4e53545241494e5420464b5f444154415f5345545f46494c45535f444154415f5345545320464f524549474e204b45592028444153455f494429205245464552454e43455320444154415f534554532028494429204f4e2044454c4554452043415343414445204f4e2055504441544520434153434144452c0a2020434f4e53545241494e5420464b5f444154415f5345545f46494c45535f444154415f5345545f46494c455320464f524549474e204b45592028504152454e545f494429205245464552454e43455320444154415f5345545f46494c45532028494429204f4e2044454c4554452043415343414445204f4e2055504441544520434153434144450a293b0a0a43524541544520494e44455820444154415f5345545f46494c45535f444153455f49445f494458204f4e20444154415f5345545f46494c45532028444153455f4944293b0a43524541544520494e44455820444154415f5345545f46494c45535f444153455f49445f504152454e545f49445f494458204f4e20444154415f5345545f46494c45532028444153455f49442c20504152454e545f4944293b0a43524541544520494e44455820444154415f5345545f46494c45535f444153455f49445f52454c41544956455f504154485f494458204f4e20444154415f5345545f46494c45532028444153455f49442c2052454c41544956455f50415448293b0a43524541544520494e44455820444154415f5345545f46494c45535f444153455f49445f46494c455f4e414d455f494458204f4e20444154415f5345545f46494c45532028444153455f49442c2046494c455f4e414d45293b0a0a435245415445205441424c45204556454e545320280a20204c4153545f5345454e5f44454c4554494f4e5f4556454e545f494420544543485f4944204e4f54204e554c4c0a293b0a0a	\N
+006	../datastore_server/source/sql/postgresql/migration/migration-005-006.sql	SUCCESS	2013-03-20 13:20:21.176	\\x0a435245415445205441424c45204c4153545f46454544494e475f4556454e5420280a2020524547495354524154494f4e5f54494d455354414d502054494d455f5354414d50204e4f54204e554c4c0a293b0a	\N
+\.
+
+
+--
+-- Data for Name: events; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY events (last_seen_deletion_event_id) FROM stdin;
+\.
+
+
+--
+-- Data for Name: last_feeding_event; Type: TABLE DATA; Schema: public; Owner: -
+--
+
+COPY last_feeding_event (registration_timestamp) FROM stdin;
+\.
+
+
+--
+-- Name: data_set_files_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
+--
+
+ALTER TABLE ONLY data_set_files
+    ADD CONSTRAINT data_set_files_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: data_sets_code_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
+--
+
+ALTER TABLE ONLY data_sets
+    ADD CONSTRAINT data_sets_code_key UNIQUE (code);
+
+
+--
+-- Name: data_sets_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
+--
+
+ALTER TABLE ONLY data_sets
+    ADD CONSTRAINT data_sets_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: data_set_files_dase_id_file_name_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX data_set_files_dase_id_file_name_idx ON data_set_files USING btree (dase_id, file_name);
+
+
+--
+-- Name: data_set_files_dase_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX data_set_files_dase_id_idx ON data_set_files USING btree (dase_id);
+
+
+--
+-- Name: data_set_files_dase_id_parent_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX data_set_files_dase_id_parent_id_idx ON data_set_files USING btree (dase_id, parent_id);
+
+
+--
+-- Name: data_set_files_dase_id_relative_path_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX data_set_files_dase_id_relative_path_idx ON data_set_files USING btree (dase_id, relative_path);
+
+
+--
+-- Name: data_sets_code_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX data_sets_code_idx ON data_sets USING btree (code);
+
+
+--
+-- Name: fk_data_set_files_data_set_files; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY data_set_files
+    ADD CONSTRAINT fk_data_set_files_data_set_files FOREIGN KEY (parent_id) REFERENCES data_set_files(id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+--
+-- Name: fk_data_set_files_data_sets; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY data_set_files
+    ADD CONSTRAINT fk_data_set_files_data_sets FOREIGN KEY (dase_id) REFERENCES data_sets(id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+--
+-- Name: public; Type: ACL; Schema: -; Owner: -
+--
+
+REVOKE ALL ON SCHEMA public FROM PUBLIC;
+REVOKE ALL ON SCHEMA public FROM postgres;
+GRANT ALL ON SCHEMA public TO postgres;
+GRANT ALL ON SCHEMA public TO PUBLIC;
+
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/js-test/servers/dsu/datastore_server/dss-tmp/.gitignore b/js-test/servers/dsu/datastore_server/dss-tmp/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/etc/log.xml b/js-test/servers/dsu/datastore_server/etc/log.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5cee0a68436a19a6c4ec4b14b580e6d9f75bf84f
--- /dev/null
+++ b/js-test/servers/dsu/datastore_server/etc/log.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
+
+  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
+     <layout class="org.apache.log4j.PatternLayout">
+       <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/>
+     </layout>
+  </appender>
+
+  <appender name="NULL" class="org.apache.log4j.varia.NullAppender" />
+
+  <root>
+     <priority value ="info" />
+     <appender-ref ref="STDOUT" />
+  </root>
+
+</log4j:configuration>
diff --git a/js-test/servers/dsu/datastore_server/etc/service.properties b/js-test/servers/dsu/datastore_server/etc/service.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5d18cb69fd1a128b12f7b5c377103aff1580ebaa
--- /dev/null
+++ b/js-test/servers/dsu/datastore_server/etc/service.properties
@@ -0,0 +1,169 @@
+# Unique code of this Data Store Server. Not more than 40 characters.
+data-store-server-code = DSS1
+
+# host name of the machine on which the datastore server is running
+host-address = http://localhost
+
+# parent directory of the store directory and all the dropboxes
+root-dir = data
+
+# The root directory of the data store
+storeroot-dir = ${root-dir}/store
+
+incoming-root-dir = ${root-dir}
+
+# Cache for data set files from other Data Store Servers
+cache-workspace-folder ${root-dir}/dss-cache
+
+# The directory where the command queue file is located; defaults to storeroot-dir 
+commandqueue-dir =
+
+# Port
+port = 20001
+use-ssl = false
+
+# Session timeout in minutes
+session-timeout = 720
+
+# Path to the keystore
+keystore.path = etc/openBIS.keystore
+# Password of the keystore
+keystore.password = changeit
+# Key password of the keystore
+keystore.key-password = changeit
+
+# The check interval (in seconds)
+check-interval = 5
+
+quiet-period = 10
+
+
+# The time-out for clean up work in the shutdown sequence (in seconds).
+# Note that that the maximal time for the shutdown sequence to complete can be as large 
+# as twice this time.
+# Remark: On a network file system, it is not recommended to turn this value to something 
+# lower than 180.
+shutdown-timeout = 180
+
+# The minimum time (in seconds) of availability of the data stream since moment when user requested
+# for the data stream url. If not specified default value (20 seconds) will be used.
+# minimum-time-to-keep-streams-in-sec = 20
+
+#�If free disk space goes below value defined here, a notification email will be sent.
+# Value must be specified in kilobytes (1048576 = 1024 * 1024 = 1GB). If no high water mark is
+# specified or if value is negative, the system will not be watching. There are 2 different kinds
+# of highwater mark supported: the one that is checking the space on the store, and one that is
+# checking the amount of free space for recovery state (on the local filesystem). 
+highwater-mark = -1
+recovery-highwater-mark = -1
+
+# If a data set is successfully registered it sends out an email to the registrator. 
+# If this property is not specified, no email is sent to the registrator. This property
+# does not affect the mails which are sent, when the data set could not be registered.
+notify-successful-registration = false
+
+# The URL of the openBIS server
+server-url = ${host-address}:20000
+
+# The username to use when contacting the openBIS server
+username = etlserver_bsse
+
+# The password for the etlserver user who contacts the openBIS server
+password=e1AWO4f0ro
+
+# The base URL for Web client access to the data store server.
+download-url = ${host-address}:${port}
+
+# SMTP properties (must start with 'mail' to be considered).
+# The current configuration saves the emails in the file system in the root directory 
+mail.smtp.host = file://${root-dir}
+# mail.smtp.host = localhost
+# mail.from = openbis-dss@localhost
+# mail.smtp.user = 
+# mail.smtp.password = 
+
+
+# Data sources
+data-sources = path-info-db 
+
+# Data source for pathinfo database
+path-info-db.version-holder-class = ch.systemsx.cisd.openbis.dss.generic.shared.PathInfoDatabaseVersionHolder
+path-info-db.databaseEngineCode = postgresql
+path-info-db.basicDatabaseName = pathinfo
+# The host and optionally port. Default is 'localhost'.
+# path-info-db.urlHostPart =
+path-info-db.databaseKind = test_js_dsu
+path-info-db.scriptFolder = datastore_server/sql
+
+# ---------------------------------------------------------------------------
+# maintenance plugins configuration
+# ---------------------------------------------------------------------------
+
+# Comma separated names of maintenance plugins. Each plugin should have configuration properties prefixed with its name.
+maintenance-plugins = post-registration, path-info-deletion
+
+# Maintenance task for post registration of all paths of a freshly registered data set to be fed into pathinfo database  
+post-registration.class = ch.systemsx.cisd.etlserver.postregistration.PostRegistrationMaintenanceTask
+post-registration.interval = 30
+post-registration.cleanup-tasks-folder = ${root-dir}/post-registration/cleanup-tasks
+post-registration.last-seen-data-set-file = ${root-dir}/post-registration/last-seen-data-set.txt
+post-registration.post-registration-tasks = pathinfo-feeding
+post-registration.pathinfo-feeding.class = ch.systemsx.cisd.etlserver.path.PathInfoDatabaseFeedingTask
+post-registration.pathinfo-feeding.compute-checksum = true
+
+# Maintenance task for deleting entries from pathinfo database after deletion of a data set
+path-info-deletion.class = ch.systemsx.cisd.etlserver.plugins.DeleteFromExternalDBMaintenanceTask
+path-info-deletion.interval = 120
+path-info-deletion.data-source = path-info-db
+path-info-deletion.data-set-table-name = data_sets
+path-info-deletion.data-set-perm-id = CODE
+
+# ---------------------------------------------------------------------------
+# processing plugins configuration
+# ---------------------------------------------------------------------------
+
+# Comma separated names of processing plugins. Each plugin should have configuration properties prefixed with its name.
+processing-plugins = path-info-db-consistency-check
+
+# Processing task that checks the consistency between the data store and the meta information stored in the PathInfoDB.
+# It sends out an email which contains all differences found. 
+path-info-db-consistency-check.label = Path Info DB consistency check
+path-info-db-consistency-check.dataset-types = .*
+path-info-db-consistency-check.class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.DataSetAndPathInfoDBConsistencyCheckProcessingPlugin
+
+# ---------------------------------------------------------------------------
+# dropbox configurations
+# ---------------------------------------------------------------------------
+inputs = default-dropbox
+dss-rpc.put-default = default-dropbox
+
+default-dropbox.incoming-dir = ${incoming-root-dir}/incoming-default
+default-dropbox.incoming-data-completeness-condition = auto-detection
+default-dropbox.top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JavaTopLevelDataSetHandlerV2
+default-dropbox.program-class = ch.systemsx.cisd.etlserver.registrator.DefaultDropbox
+default-dropbox.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor
+default-dropbox.validation-script-path = ../core-plugins/default/default-validation-script.py
+
+# ---------------------------------------------------------------------------
+# Archiver configuration (optional)
+# ---------------------------------------------------------------------------
+
+# Configuration of an archiver task. All properties are prefixed with 'archiver.'.
+
+# Archiver class specification (together with the list of packages this class belongs to).
+#archiver.class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.demo.DemoArchiver
+
+# ---------------------------------------------------------------------------
+# Imaging database for screening (optional, only used if screening technology switched on)
+# ---------------------------------------------------------------------------
+# Format: <host>[:<port>]. Default: localhost
+# imaging-database.url-host-part =
+# Default: prod.
+imaging-database.kind = test_js_dsu
+
+
+# ---------------------------------------------------------------------------
+#                      INTERNAL CONFIGURATION, 
+# Do not change this part unless you are developing openBIS extensions.
+# ---------------------------------------------------------------------------
+
diff --git a/js-test/servers/dsu/datastore_server/log-registrations/failed/.gitignore b/js-test/servers/dsu/datastore_server/log-registrations/failed/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/log-registrations/in-process/.gitignore b/js-test/servers/dsu/datastore_server/log-registrations/in-process/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/log-registrations/succeeded/.gitignore b/js-test/servers/dsu/datastore_server/log-registrations/succeeded/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/datastore_server/recovery-state/default-dropbox/.gitignore b/js-test/servers/dsu/datastore_server/recovery-state/default-dropbox/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/openBIS-server/.dynamic_property_evaluator_queue b/js-test/servers/dsu/openBIS-server/.dynamic_property_evaluator_queue
new file mode 100644
index 0000000000000000000000000000000000000000..2e08dce276e43c677d121d627a250d1710fed824
Binary files /dev/null and b/js-test/servers/dsu/openBIS-server/.dynamic_property_evaluator_queue differ
diff --git a/js-test/servers/dsu/openBIS-server/db/.gitignore b/js-test/servers/dsu/openBIS-server/db/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/js-test/servers/dsu/openBIS-server/etc/log.xml b/js-test/servers/dsu/openBIS-server/etc/log.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c437339ded6a0516430f8b148c172fccb4ec73f3
--- /dev/null
+++ b/js-test/servers/dsu/openBIS-server/etc/log.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!--
+  // This configuration file is suitable for testing purposes. 
+-->
+<log4j:configuration debug="true" xmlns:log4j='http://jakarta.apache.org/log4j/'>
+
+  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
+    <layout class="org.apache.log4j.PatternLayout">
+      <!--
+        // %d: outputs the date of the logging event.
+        // %-5p: priority (i.e. level) of the logging event should be left justified to
+        //       a width of five characters.
+        // %t: outputs the name of the thread that generated the logging event.
+        // %c: outputs the category of the logging event.
+        // %m: outputs the application supplied message associated with the logging event.
+        // %n: outputs the platform dependent line separator character or characters.
+        // %X: outputs the MDC (mapped diagnostic context) associated with the thread that generated the logging event.
+      -->
+      <param name="ConversionPattern"
+        value="%d %-5p [%t]%X{sessionInfo} %c - %m%n" />
+    </layout>
+  </appender>
+
+  <!--
+    // Defined but not used right now.
+  -->
+  <appender name="NULL" class="org.apache.log4j.varia.NullAppender" />
+
+  <!--
+    // Enable full wire (header and content) + context logging
+    // For more information look at http://jakarta.apache.org/commons/httpclient/logging.html.
+    // We do not need to set a level value here as loggers inherit their level from the root logger.
+  -->
+
+  <!-- 
+    // Do not use log level debug otherwise plain passwords are readable.
+  -->
+  <logger name="httpclient.wire">
+    <level value="ERROR" />
+  </logger>
+
+  <!--  
+    // Uncomment this for debugging value binding in Hibernate
+      <category name="org.hibernate.type">  
+        <priority value="TRACE"/>  
+      </category>
+  -->
+
+  <!--
+    <logger name="org.apache.commons.httpclient">
+    <level value="DEBUG" />
+    </logger>
+  -->
+
+  <root>
+    <priority value="info" />
+    <appender-ref ref="STDOUT" />
+  </root>
+
+</log4j:configuration>
diff --git a/js-test/servers/dsu/openBIS-server/etc/service.properties b/js-test/servers/dsu/openBIS-server/etc/service.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e7e07c1253e20779096adf527363323441f933c6
--- /dev/null
+++ b/js-test/servers/dsu/openBIS-server/etc/service.properties
@@ -0,0 +1,254 @@
+# ---------------------------------------------------------------------------
+# Core plugins configuration
+# ---------------------------------------------------------------------------
+
+core-plugins-folder=../core-plugins
+
+# ---------------------------------------------------------------------------
+# Database configuration
+# ---------------------------------------------------------------------------
+# The database instance local unique identifier. Used when the new database is created.
+database-instance = DEFAULT
+
+# The host and optionally port. Default is 'localhost'.
+# database.url-host-part =
+database.kind = test_js_dsu
+# User who owns the database. Default: Operating system user running the server.
+database.owner =
+database.owner-password =
+# Superuser of the database. Default: database-dependent.
+database.admin-user = 
+database.admin-password =
+# Max. number of active database connections. Default: 20. 
+database.max-active-connections =
+# Max. number of idle database connections to keep open. Default: 20.  
+database.max-idle-connections = 
+# Log interval (in seconds) between two regular log entries of the number of active database 
+# connections. Default: 3600s.
+database.active-connections-log-interval =
+
+# ---------------------------------------------------------------------------
+# Authentication configuration
+# ---------------------------------------------------------------------------
+# Supported Authentication options are:
+# 'file-authentication-service'
+# 'ldap-authentication-service'
+# 'crowd-authentication-service'
+# 'file-crowd-authentication-service'
+# 'file-ldap-authentication-service'
+# 'stacked-authentication-service' : ldap - crowd
+# For a detailed description please have a look at the Installation and Administrator
+# Guide of the openBIS Server: https://wiki-bsse.ethz.ch/x/oYIUBQ 
+
+authentication-service = dummy-authentication-service
+dss-rpc.put.dss-code = DSS1
+
+# ---------------------------------------------------------------------------
+# Crowd configuration
+# ---------------------------------------------------------------------------
+crowd.service.host = crowd-bsse.ethz.ch
+crowd.service.port = 8443
+crowd.application.name = openbis
+crowd.application.password =
+
+# ---------------------------------------------------------------------------
+# LDAP configuration
+# ---------------------------------------------------------------------------
+# The URL of the LDAP server, e.g. "ldap://d.ethz.ch/DC=d,DC=ethz,DC=ch"
+ldap.server.url = <LDAP URL>
+# The distinguished name of the security principal,
+# e.g. "CN=carl,OU=EthUsers,DC=d,DC=ethz,DC=ch"
+ldap.security.principal.distinguished.name = <distinguished name to login to the LDAP server>
+# Password of the LDAP user account that will be used to login to the LDAP server to perform the queries
+ldap.security.principal.password = <password of the user to connect to the LDAP server>
+# The security protocol to use, use "ssl" or "none", default is "ssl"
+ldap.security.protocol =
+# The authentication method to use: "none" (no authentication), "simple", "strong" (SASL), defaults to "simple"
+ldap.security.authentication-method =
+# The referral mode:
+# "follow" - follow referrals automatically (the default)
+# "ignore" - ignore referrals
+# "throw" - throw ReferralException when a referral is encountered
+ldap.referral =
+# The attribute name for the user id, defaults to "uid"
+ldap.attributenames.user.id =
+# The attribute name for the email, defaults to "mail"
+ldap.attributenames.email =
+# The attribute name for the first name, defaults to "givenName"
+ldap.attributenames.first.name =
+# The attribute name for the last name, defaults to "sn"
+ldap.attributenames.last.name =
+# Set to true to also query for email aliases
+ldap.queryEmailForAliases = true
+# The query template, needs to contain %s which will be filled with the query term, e.g. uid=username
+# The default is:
+# ldap.queryTemplate = (&(objectClass=organizationalPerson)(objectCategory=person)(objectClass=user)(%s))
+# which is known to work for many Active Directory installations.
+# For OpenLDAP, replace by: 
+# ldap.queryTemplate = (&(%s))
+# For restriction to BSSE accounts in OpenLDAP, set to: 
+# ldap.queryTemplate = (&(objectClass=bssePosixAccount)(%s))
+ldap.queryTemplate = 
+# The number of times a failed LDAP query is retried at the max. Default: 1.
+ldap.maxRetries = 
+# The timeout (in ms) to wait for an LDAP query to return, -1 for "wait indefinitely". Default: 10000. 
+ldap.timeout = 
+# Time time (in ms) to wait after a failure before retrying the query. Default: 10000. 
+ldap.timeToWaitAfterFailure=
+
+# ---------------------------------------------------------------------------
+# Anonymous login configuration (optional)
+# ---------------------------------------------------------------------------
+# Login of the existing user whose settings will be used for anonymous login 
+#user-for-anonymous-login = <user-login>
+
+# ---------------------------------------------------------------------------
+# Client configuration
+# ---------------------------------------------------------------------------
+# Name of the file that stores Web Client configuration
+web-client-configuration-file = etc/web-client.properties
+
+# A comma-separated list of trusted cross-origin domains, that are allowed to
+# query openBIS content. Typically these are lightweight webapps that integrate with openBIS 
+# via JSON-RPC services, but are not directly hosted within the openBIS application.
+# 
+# Example 1 (two different domains configured):
+# 
+# trusted-cross-origin-domains=https://myapp.domain.com:8443, http://other.domain.com
+#
+# Example 2 (match every domain):
+#
+# trusted-cross-origin-domains= *
+#
+# The '*' matches any arbitrary domain. It should be used with care as it opens openBIS 
+# for potential cross-site scripting attacks.
+#
+#trusted-cross-origin-domains=
+
+# ---------------------------------------------------------------------------
+# Session configuration
+# ---------------------------------------------------------------------------
+# The time after which an inactive session is expired by the service (in minutes).
+session-timeout = 720
+
+# ---------------------------------------------------------------------------
+# Business rules configuration
+# ---------------------------------------------------------------------------
+# When set to "true" enables the system to store material codes containing non-alphanumeric characters.
+# Regardless of the value of this property no white spaces are allowed in the material codes.
+#material-relax-code-constraints=false
+
+# ---------------------------------------------------------------------------
+# CIFEX connection configuration.
+# ---------------------------------------------------------------------------
+# The URL of the CIFEX server
+cifex-url = https://cifex.ethz.ch:443
+# Cifex users that will receive and automatically manage uploaded data.
+# The user names should be prepended with 'id:' prefix for example. 
+# Example:
+# cifex-recipient = id:dropboxuser, id:backpuser
+cifex-recipient = 
+
+# ---------------------------------------------------------------------------
+# Hibernate Search
+# ---------------------------------------------------------------------------
+# The working directory.
+hibernate.search.index-base = ./indices
+# One of NO_INDEX, SKIP_IF_MARKER_FOUND, INDEX_FROM_SCRATCH.
+# If not specified, default (SKIP_IF_MARKER_FOUND) is taken.
+hibernate.search.index-mode = SKIP_IF_MARKER_FOUND
+# Defines the maximum number of elements indexed before flushing the transaction-bound queue.
+# Default is 1000.
+hibernate.search.batch-size = 1000
+# Maximum number of search results
+hibernate.search.maxResults = 100000
+# If 'async', the update of indices will be done in a separate thread.
+hibernate.search.worker.execution=async
+
+# ---------------------------------------------------------------------------
+# Online Help
+# ---------------------------------------------------------------------------
+# Online help is broken into two sections -- generic and specific. Generic help links back to
+# the CISD. Specific help is provided by the host of the installation
+#
+# OpenBIS needs to know the root URL for the online help and a template for the individual pages.
+# The template should have on parameter, called title, and should be constructed to automatically
+# create the page if it does not already exist.
+# The template can be created by going to the root page, adding a new link to the page, and
+# replacing the title of the new page with the ${title}
+onlinehelp.generic.root-url = https://wiki-bsse.ethz.ch/display/CISDDoc/OnlineHelp
+onlinehelp.generic.page-template = https://wiki-bsse.ethz.ch/pages/createpage.action?spaceKey=CISDDoc&title=${title}&linkCreation=true&fromPageId=40633829
+#onlinehelp.specific.root-url = https://wiki-bsse.ethz.ch/display/CISDDoc/OnlineHelp
+#onlinehelp.specific.page-template = https://wiki-bsse.ethz.ch/pages/createpage.action?spaceKey=CISDDoc&title=${title}&linkCreation=true&fromPageId=40633829
+
+# ---------------------------------------------------------------------------
+# JMX memory monitor
+# ---------------------------------------------------------------------------
+# Interval between two runs of the memory monitor (in seconds). 
+# Set to -1 to disable the memory monitor.
+memorymonitor-monitoring-interval = 60
+# Interval between two regular log call of the memory monitor (in seconds).
+# Set to -1 to disable regular memory usage logging. 
+memorymonitor-log-interval = 3600
+# The percentage of memory that, if exceeded, triggers a notify log of the memory manager, 
+# Set to 100 to disable.
+memorymonitor-high-watermark-percent = 90
+
+# ---------------------------------------------------------------------------
+# Database Configurations for Query module (optional)
+# ---------------------------------------------------------------------------
+# Comma separated keys of databases configured for Query module.
+# Each database should have configuration properties prefixed with its key.
+# Mandatory properties for each <database> include: 
+#   <database>.label                - name shown to the openBIS user when adding or editing a customized query
+#		<database>.database-driver      - JDBC Driver of the database (e.g. org.postgresql.Driver)
+#   <database>.database-url	        - JDBC URL to the database (e.g. jdbc:postgresql://localhost/openbis)
+# Optional properties for each <database> include:
+#   <database>.database-user        - name of the database user (default: user.name from system properties)
+#   <database>.database-password    - password of the database user
+#   <database>.creator-minimal-role - minimal role required to create/edit queries on this database (default: POWER_USER)
+#   <database>.data-space           - If NOT specified OBSERVER of any space will be allowed to perform 
+#                                     queries and <creator-minimal-role> of any space will allowed 
+#                                     to create/edit queries on this DB.
+#                                   - If specified only OBSERVER of the space will be allowed to perform 
+#                                     queries and <creator-minimal-role> of the space will allowed 
+#                                     to create/edit queries on this DB.
+#query-databases = openbisDB
+#
+#openbisDB.label = openBIS meta data
+#openbisDB.data-space = CISD
+#openbisDB.creator-minimal-role = SPACE_ADMIN
+#openbisDB.database-driver = org.postgresql.Driver
+#openbisDB.database-url = jdbc:postgresql://localhost/openbis_standard-technologies
+#openbisDB.database-username =
+#openbisDB.database-password =
+
+# ---------------------------------------------------------------------------
+# Maintenance plugins configuration (optional)
+# ---------------------------------------------------------------------------
+# Comma separated names of maintenance plugins.  
+# Each plugin should have configuration properties prefixed with its name.
+# Mandatory properties for each <plugin> include: 
+#   <plugin>.class - Fully qualified plugin class name
+#   <plugin>.interval - The time between plugin executions (in seconds)
+# Optional properties for each <plugin> include:
+#   <plugin>.start - Time of the first execution (HH:mm)
+#   <plugin>.execute-only-once - If true the task will be executed exactly once, 
+#                                interval will be ignored. By default set to false.
+#maintenance-plugins = demo
+#
+#demo.class = ch.systemsx.cisd.openbis.generic.server.task.DemoMaintenanceTask
+#demo.interval = 60
+#demo.property_1 = some value
+#demo.property_2 = some value 2
+
+#
+# Internal - do not change
+#
+
+# Authorization
+# Supported: 'no-authorization' and 'active-authorization'
+authorization-component-factory = active-authorization
+
+script-folder = .
+
diff --git a/js-test/servers/dsu/openBIS-server/etc/web-client.properties b/js-test/servers/dsu/openBIS-server/etc/web-client.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f946e8e9637b650d76c5bb464b0dffb5d75843af
--- /dev/null
+++ b/js-test/servers/dsu/openBIS-server/etc/web-client.properties
@@ -0,0 +1,77 @@
+# Experimental: Enable moving entities to trash (non-permanent deletion).
+# Default value: false
+enable-trash = true
+
+# Default view mode that should be used if user doesn't have it specified in URL. 
+# Options: 'NORMAL' (standard mode - default), 'SIMPLE' (readonly mode with simplified GUI). 
+#
+#default-view-mode = SIMPLE
+
+# Flag specifying whether default login mode is anonymous or not. 
+# If true a user-for-anonymous-login has to be defined in service.properties
+# Default value: false
+#default-anonymous-login = true
+
+# Maximal number of visible columns in tables. Default: 50.
+max-visible-columns = 25
+
+# Should the feature of adding unofficial/ad-hoc terms to vocabularies be turned on.
+# Default value: false 
+allow-adding-unofficial-terms = true
+
+# (optional) List of data set types for which there should be an image overview shown in dataset tables.
+# If not specified image overview will not be shown for any datasets. 
+data-set-types-with-image-overview = HCS_IMAGE, UNKNOWN
+
+# (optional) Allows power users adding vocabulary terms when editing the form.
+# If not specified, default is false
+# allow-adding-unofficial-terms = true
+
+# Configuration of entity (experiment, sample, data set, material) detail views.
+#
+# Mandatory properties: 
+#   - view (entity detail view id) 
+#   - types (list of entity type codes)
+# Optional properties: 
+#   - hide-sections (list of section ids)
+#   - hide-smart-view (removes "Smart View" from Data Set Detail View -> Data View) (generic_dataset_viewer)
+#   - hide-file-view (removes "File View" from Data Set Detail View -> Data View) (generic_dataset_viewer)
+# Available sections in entity-detail-views:
+#   generic_dataset_viewer
+#   	data-set-data-section
+#   	data-set-parents-section
+#   	data-set-children-section
+#   	data-set-contained-section
+#   	query-section
+#   generic_experiment_viewer
+#   	data-sets-section
+#   	attachment-section
+#   	query-section
+#   	experiment-sample-section
+#   generic_sample_viewer
+#   	container-sample-section
+#   	derived-samples-section
+#   	parent-samples-section
+#   	data-sets-section
+#   	attachment-section
+#   	query-section
+#   generic_material_viewer
+#   	query-section
+#
+# Example:
+# 
+detail-views = sample-view, experiment-view, data-view  
+
+sample-view.view = generic_sample_viewer
+sample-view.types = CELL_PLATE, CONTROL_LAYOUT
+sample-view.hide-sections = attachment-section, module-section
+
+experiment-view.view = generic_experiment_viewer
+experiment-view.types = COMPOUND_HCS
+experiment-view.hide-sections = attachment-section
+
+data-view.view = generic_dataset_viewer
+data-view.types = HCS_IMAGE
+data-view.hide-smart-view = false
+data-view.hide-file-view = false
+