diff --git a/microservice-server/build.gradle b/microservice-server/build.gradle
index 31097d3b24565f8e6900b88d4099481782a3e39d..102904d066390e9b8f32243d7a0bcaf451b2426d 100644
--- a/microservice-server/build.gradle
+++ b/microservice-server/build.gradle
@@ -6,6 +6,7 @@ task wrapper(type: Wrapper) {
 }
 
 repositories {
+    mavenCentral()
     ivy {
         ivyPattern "http://svnsis.ethz.ch/repos/cisd/ivy-repository/trunk/[organisation]/[module]/[revision]/ivy.xml"
         artifactPattern "http://svnsis.ethz.ch/repos/cisd/ivy-repository/trunk/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"
@@ -24,7 +25,7 @@ dependencies {
 }
 
 
-mainClassName = "ch.ethz.sis.microservices.server.startup.Main"
+mainClassName = "ch.ethz.sis.microservices.download.server.startup.Main"
 
 distZip {
     into(project.name) {
diff --git a/microservice-server/conf/config.json b/microservice-server/conf/config.json
index 07d1a974a84c6faaa91d1079cf2c445bcb87055d..44f4444e74b4c2bac44e55f10ee11c2c28a26f4f 100644
--- a/microservice-server/conf/config.json
+++ b/microservice-server/conf/config.json
@@ -2,7 +2,7 @@
 	"port" : 8080,
 	"services" : [
 		{	
-			"className" : "ch.ethz.sis.microservices.server.services.store.FileInfoHandler", 
+			"className" : "ch.ethz.sis.microservices.download.server.services.store.FileInfoHandler", 
 			"url" : "/file-information",
 			"parameters" : {
 				"openbis-url" : "http://localhost:8888/openbis/openbis/rmi-application-server-v3",
@@ -13,7 +13,7 @@
 			}
 		}, 
 		{ 
-			"className" : "ch.ethz.sis.microservices.server.services.store.DownloadHandler", 
+			"className" : "ch.ethz.sis.microservices.download.server.services.store.DownloadHandler", 
 			"url" : "/download",
 			"parameters" : { 
 				"openbis-url" : "http://localhost:8888/openbis/openbis/rmi-application-server-v3",
diff --git a/microservice-server/config.json b/microservice-server/config.json
new file mode 100644
index 0000000000000000000000000000000000000000..44f4444e74b4c2bac44e55f10ee11c2c28a26f4f
--- /dev/null
+++ b/microservice-server/config.json
@@ -0,0 +1,27 @@
+{
+	"port" : 8080,
+	"services" : [
+		{	
+			"className" : "ch.ethz.sis.microservices.download.server.services.store.FileInfoHandler", 
+			"url" : "/file-information",
+			"parameters" : {
+				"openbis-url" : "http://localhost:8888/openbis/openbis/rmi-application-server-v3",
+				"datastore-url" : "http://localhost:8889/datastore_server/rmi-data-store-server-v3",
+				"services-timeout" : "10000",
+				"allowedExternalDMSCode" : "ADMIN-BS-MBPR28.D.ETHZ.CH-E96954A7",
+				"allowedContentCopyPath" : "/Users/localadmin/obis_data/"
+			}
+		}, 
+		{ 
+			"className" : "ch.ethz.sis.microservices.download.server.services.store.DownloadHandler", 
+			"url" : "/download",
+			"parameters" : { 
+				"openbis-url" : "http://localhost:8888/openbis/openbis/rmi-application-server-v3",
+				"datastore-url" : "http://localhost:8889/datastore_server/rmi-data-store-server-v3",
+				"services-timeout" : "10000",
+				"allowedExternalDMSCode" : "ADMIN-BS-MBPR28.D.ETHZ.CH-E96954A7",
+				"allowedContentCopyPath" : "/Users/localadmin/obis_data/"
+			}
+		} 
+	]
+}
\ No newline at end of file
diff --git a/microservice-server/gradle/wrapper/gradle-wrapper.properties b/microservice-server/gradle/wrapper/gradle-wrapper.properties
index 2df108562a21e0116bc037aeae24a5aa9efda179..3bde4b663e7fae0d3df1cddeb38898f41709b1b6 100644
--- a/microservice-server/gradle/wrapper/gradle-wrapper.properties
+++ b/microservice-server/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=http\://svnsis.ethz.ch/repos/cisd/ivy-repository/trunk/gradle/distribution/4.5/gradle-4.5-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-bin.zip
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/.DS_Store b/microservice-server/src/main/java/ch/ethz/sis/microservices/.DS_Store
deleted file mode 100644
index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000
Binary files a/microservice-server/src/main/java/ch/ethz/sis/microservices/.DS_Store and /dev/null differ
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/api/configuration/Config.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/api/configuration/Config.java
similarity index 72%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/api/configuration/Config.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/api/configuration/Config.java
index a5dc538fdb3793dbd92d564c08ad6d1139866306..0dbc2068f6c266d2447a75759f34d3b6ae2474c3 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/api/configuration/Config.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/api/configuration/Config.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.api.configuration;
+package ch.ethz.sis.microservices.download.api.configuration;
 
 import lombok.Data;
 import lombok.NoArgsConstructor;
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/api/configuration/ServiceConfig.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/api/configuration/ServiceConfig.java
similarity index 79%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/api/configuration/ServiceConfig.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/api/configuration/ServiceConfig.java
index bd173c2835c751dc172251c5cd53acf755fdcffa..cf7545ef5b7d8c5695e759713540128a9594f8f0 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/api/configuration/ServiceConfig.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/api/configuration/ServiceConfig.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.api.configuration;
+package ch.ethz.sis.microservices.download.api.configuration;
 
 import java.util.HashMap;
 
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/json/JSONObjectMapper.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/json/JSONObjectMapper.java
similarity index 78%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/json/JSONObjectMapper.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/json/JSONObjectMapper.java
index 83eaf3e9cfc209bc08441425b413f1c12bc06bcb..20682273fb35b6c20af158709af45e33a26c2fa3 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/json/JSONObjectMapper.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/json/JSONObjectMapper.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.server.json;
+package ch.ethz.sis.microservices.download.server.json;
 
 import java.io.FileInputStream;
 
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/json/jackson/JacksonObjectMapper.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/json/jackson/JacksonObjectMapper.java
similarity index 89%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/json/jackson/JacksonObjectMapper.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/json/jackson/JacksonObjectMapper.java
index 3b94a6fbf26f6b7bafdfe06e1e77c77bd1790ffb..8821bac0747eb6906efc3d293bdc00f34ea9188b 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/json/jackson/JacksonObjectMapper.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/json/jackson/JacksonObjectMapper.java
@@ -1,11 +1,11 @@
-package ch.ethz.sis.microservices.server.json.jackson;
+package ch.ethz.sis.microservices.download.server.json.jackson;
 
 import java.io.FileInputStream;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 
-import ch.ethz.sis.microservices.server.json.JSONObjectMapper;
+import ch.ethz.sis.microservices.download.server.json.JSONObjectMapper;
 
 public class JacksonObjectMapper implements JSONObjectMapper
 {
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/LogFactory.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/LogFactory.java
similarity index 55%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/LogFactory.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/LogFactory.java
index b0695fc665686a64a43ba125408d60c4cc2f3d4b..c2ae5ee24a75a41c271589318f9241da7226c09f 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/LogFactory.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/LogFactory.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.server.logging;
+package ch.ethz.sis.microservices.download.server.logging;
 
 public interface LogFactory {
     <T> Logger getLogger(Class<T> clazz);
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/LogFactoryFactory.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/LogFactoryFactory.java
similarity index 76%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/LogFactoryFactory.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/LogFactoryFactory.java
index 43eae4473b942ed66dbe2c884d250e3edc74b9e3..23d94da82515f78529f6afe33eac5b91c8a601d9 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/LogFactoryFactory.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/LogFactoryFactory.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.server.logging;
+package ch.ethz.sis.microservices.download.server.logging;
 
 public class LogFactoryFactory {
     public LogFactory create(String logFactoryClass) throws Exception {
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/LogManager.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/LogManager.java
similarity index 89%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/LogManager.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/LogManager.java
index 1f96db4a711e0450512bbbe76b98bb2a9cdade6f..c1ef440056774de5e635f925496a3a289c8256c2 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/LogManager.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/LogManager.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.server.logging;
+package ch.ethz.sis.microservices.download.server.logging;
 
 public class LogManager {
     private static LogFactory factory;
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/Logger.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/Logger.java
similarity index 82%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/Logger.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/Logger.java
index 93c296a11e88a6e4e7d37997dea222be5d7e3497..3e9c2742a4181728b33893860ac1a663d906baca 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/Logger.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/Logger.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.server.logging;
+package ch.ethz.sis.microservices.download.server.logging;
 
 
 public interface Logger {
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/log4j/Log4J2LogFactory.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/log4j/Log4J2LogFactory.java
similarity index 54%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/log4j/Log4J2LogFactory.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/log4j/Log4J2LogFactory.java
index 5d43e3a32a26a0b509485254e442419f18e905dd..27cd6b6881f8f8127156313ca79664531a6f9054 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/log4j/Log4J2LogFactory.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/log4j/Log4J2LogFactory.java
@@ -1,9 +1,9 @@
-package ch.ethz.sis.microservices.server.logging.log4j;
+package ch.ethz.sis.microservices.download.server.logging.log4j;
 
 import org.apache.logging.log4j.LogManager;
 
-import ch.ethz.sis.microservices.server.logging.LogFactory;
-import ch.ethz.sis.microservices.server.logging.Logger;
+import ch.ethz.sis.microservices.download.server.logging.LogFactory;
+import ch.ethz.sis.microservices.download.server.logging.Logger;
 
 public class Log4J2LogFactory implements LogFactory
 {
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/log4j/Log4JLogger.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/log4j/Log4JLogger.java
similarity index 92%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/log4j/Log4JLogger.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/log4j/Log4JLogger.java
index 39a9eace264006cbd8af6203879baf3b578d1422..a605ec7a512362de61bf63422d483003001049a7 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/logging/log4j/Log4JLogger.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/logging/log4j/Log4JLogger.java
@@ -1,11 +1,11 @@
-package ch.ethz.sis.microservices.server.logging.log4j;
+package ch.ethz.sis.microservices.download.server.logging.log4j;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.spi.AbstractLogger;
 import org.apache.logging.log4j.spi.ExtendedLoggerWrapper;
 
-class Log4JLogger extends ExtendedLoggerWrapper implements ch.ethz.sis.microservices.server.logging.Logger
+class Log4JLogger extends ExtendedLoggerWrapper implements ch.ethz.sis.microservices.download.server.logging.Logger
 {
 
     private final String FQCN;
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/Service.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/Service.java
similarity index 71%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/Service.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/Service.java
index c38c32983ef25ec8eb04e017d72548724fe02605..0e9f65b8ab904497953450e778fd6f8961302684 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/Service.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/Service.java
@@ -1,8 +1,8 @@
-package ch.ethz.sis.microservices.server.services;
+package ch.ethz.sis.microservices.download.server.services;
 
 import javax.servlet.http.HttpServlet;
 
-import ch.ethz.sis.microservices.api.configuration.ServiceConfig;
+import ch.ethz.sis.microservices.download.api.configuration.ServiceConfig;
 
 public abstract class Service extends HttpServlet
 {
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/store/AbstractFileServiceHandler.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/AbstractFileServiceHandler.java
similarity index 71%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/store/AbstractFileServiceHandler.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/AbstractFileServiceHandler.java
index 7c28850e592c061eb3fbff48f534c4adebf2eb81..9f10304c1def85fb15b6e92f77eab0bf097561d3 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/store/AbstractFileServiceHandler.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/AbstractFileServiceHandler.java
@@ -1,24 +1,21 @@
-package ch.ethz.sis.microservices.server.services.store;
+package ch.ethz.sis.microservices.download.server.services.store;
 
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Arrays;
-import java.util.Deque;
-import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedDeque;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import ch.ethz.sis.microservices.server.logging.LogManager;
-import ch.ethz.sis.microservices.server.logging.Logger;
-import ch.ethz.sis.microservices.server.services.Service;
+import ch.ethz.sis.microservices.download.server.logging.LogManager;
+import ch.ethz.sis.microservices.download.server.logging.Logger;
+import ch.ethz.sis.microservices.download.server.services.Service;
 import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.ContentCopy;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSet;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetFetchOptions;
@@ -29,7 +26,6 @@ import ch.ethz.sis.openbis.generic.dssapi.v3.dto.datasetfile.DataSetFile;
 import ch.ethz.sis.openbis.generic.dssapi.v3.dto.datasetfile.fetchoptions.DataSetFileFetchOptions;
 import ch.ethz.sis.openbis.generic.dssapi.v3.dto.datasetfile.search.DataSetFileSearchCriteria;
 import ch.systemsx.cisd.common.spring.HttpInvokerUtils;
-import lombok.Value;
 
 public abstract class AbstractFileServiceHandler extends Service
 {
@@ -70,10 +66,10 @@ public abstract class AbstractFileServiceHandler extends Service
         Path pathToFile = getPathToFile(contentCopyPath, datasetPathToFile);
         if (isFileAccessible)
         {
-            success(pathToFile, response);
+            success(pathToFile, request, response);
         } else
         {
-            failure(pathToFile, response);
+            failure(pathToFile, request, response);
         }
     }
 
@@ -85,9 +81,9 @@ public abstract class AbstractFileServiceHandler extends Service
         doAction(request, response);
     }
 
-    protected abstract void success(Path pathToFile, HttpServletResponse response) throws ServletException, IOException;
+    protected abstract void success(Path pathToFile, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
 
-    protected abstract void failure(Path pathToFile, HttpServletResponse response) throws ServletException, IOException;
+    protected abstract void failure(Path pathToFile, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
 
     private DataSet getDataset(String openbisURL, int openbisTimeout, String sessionToken, String datasetPermId, String externalDMSCode,
             String contentCopyPath)
@@ -110,68 +106,17 @@ public abstract class AbstractFileServiceHandler extends Service
         }
         return null;
     }
-    
-    /*
-     * Less recently used cache
-     * Keeps maxSize items
-     */
-    @Value
-    private static class LRUCache<KEY, VALUE> {
-
-        int maxSize;
-        Map<KEY, VALUE> cacheByKey = new ConcurrentHashMap<>();
-        Deque<KEY> cachePriority = new ConcurrentLinkedDeque<>();
-
-        public LRUCache(int maxSize) {
-            this.maxSize = maxSize;
-        }
-
-        public void add(KEY key, VALUE value) {
-            // Remove if existing
-            if(cacheByKey.containsKey(key)) {
-                cacheByKey.remove(key);
-                cachePriority.remove(key);
-            }
-
-            // Add again
-            cacheByKey.put(key, value);
-            cachePriority.addFirst(key);
-
-            // Remove oldest if the list grow too much
-            if(cachePriority.size() > maxSize) {
-                cacheByKey.remove(cachePriority.removeLast());
-            }
-        }
-
-        public VALUE get(KEY key) {
-            // Refresh Prio
-            if(cacheByKey.containsKey(key)) {
-                cachePriority.remove(key);
-                cachePriority.addFirst(key);
-            }
-
-            return cacheByKey.get(key);
-        }
-
-    }
-
-    private static LRUCache<String, List<DataSetFile>> cache = new LRUCache<>(1000);
 
     private DataSetFile getDatasetFile(String datastoreURL, int datastoreTimeout, String sessionToken, String datasetPermId,
             String datasetPathToFile)
     {
-        List<DataSetFile> files = cache.get(datasetPermId);
-        
-        if(files == null) {
-            IDataStoreServerApi v3Dss = HttpInvokerUtils.createServiceStub(IDataStoreServerApi.class, datastoreURL, datastoreTimeout);
-            DataSetFileSearchCriteria searchCriteria = new DataSetFileSearchCriteria();
-            searchCriteria.withDataSet().withCode().thatEquals(datasetPermId);
-            DataSetFileFetchOptions fetchOptions = new DataSetFileFetchOptions();
-            files = v3Dss.searchFiles(sessionToken, searchCriteria, fetchOptions).getObjects();
-            cache.add(datasetPermId, files);
-        }
-        
-        for (DataSetFile file : files)
+        IDataStoreServerApi v3Dss = HttpInvokerUtils.createServiceStub(IDataStoreServerApi.class, datastoreURL, datastoreTimeout);
+
+        DataSetFileSearchCriteria searchCriteria = new DataSetFileSearchCriteria();
+        searchCriteria.withDataSet().withCode().thatEquals(datasetPermId);
+        DataSetFileFetchOptions fetchOptions = new DataSetFileFetchOptions();
+        SearchResult<DataSetFile> files = v3Dss.searchFiles(sessionToken, searchCriteria, fetchOptions);
+        for (DataSetFile file : files.getObjects())
         {
             if (file.getPath().equals(datasetPathToFile))
             {
diff --git a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/AbstractFileServiceTest.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/AbstractFileServiceTest.java
similarity index 66%
rename from microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/AbstractFileServiceTest.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/AbstractFileServiceTest.java
index 4dcf5b8da81804b0506750573a26174e18c9f899..c7b0801bda745bd4fe586b099796343e1b58db73 100644
--- a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/AbstractFileServiceTest.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/AbstractFileServiceTest.java
@@ -1,11 +1,11 @@
-package ch.ethz.sis.microservices.server.services.store;
+package ch.ethz.sis.microservices.download.server.services.store;
 
 import java.util.HashMap;
 import java.util.Map;
 
-import ch.ethz.sis.microservices.server.logging.LogManager;
-import ch.ethz.sis.microservices.server.logging.log4j.Log4J2LogFactory;
-import ch.ethz.sis.microservices.util.HttpClient;
+import ch.ethz.sis.microservices.download.server.logging.LogManager;
+import ch.ethz.sis.microservices.download.server.logging.log4j.Log4J2LogFactory;
+import ch.ethz.sis.microservices.download.server.startup.HttpClient;
 import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.systemsx.cisd.common.spring.HttpInvokerUtils;
 
@@ -17,13 +17,13 @@ public class AbstractFileServiceTest
         LogManager.setLogFactory(new Log4J2LogFactory());
     }
 
-    public static void test(String openbisURL, String serviceURL, String user, String pass) throws Exception
+    public static void test(String openbisURL, String serviceURL, String user, String pass, Long offset) throws Exception
     {
         // Service
         String externalDMSCode = "ADMIN-BS-MBPR28.D.ETHZ.CH-E96954A7";
-        String contentCopyPath = "/Users/localadmin/obis_data/data";
-        String datasetPermId = "20180131090547942-3";
-        String datasetPathToFile = "file";
+        String contentCopyPath = "/Users/localadmin/obis_data/data1";
+        String datasetPermId = "20180523115921026-50";
+        String datasetPathToFile = "openBIS-installation-standard-technologies-SNAPSHOT-r1526484921.tar.gz";
 
         // Obtain session token from openBIS
         int timeout = 10000;
@@ -36,11 +36,15 @@ public class AbstractFileServiceTest
         parameters.put("externalDMSCode", externalDMSCode);
         parameters.put("contentCopyPath", contentCopyPath);
         parameters.put("datasetPathToFile", datasetPathToFile);
+        if(offset != null) {
+        		parameters.put("offset", offset.toString());
+        }
+        
 
         long start = System.currentTimeMillis();
         byte[] response = HttpClient.doGet(serviceURL, parameters);
         long end = System.currentTimeMillis();
-        System.out.println(new String(response));
+        System.out.println("Response Size: " + response.length);
         System.out.println("Time: " + (end - start));
     }
 }
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/DownloadHandler.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/DownloadHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..756ac3e5ac20b7317d30fadc1b150dbf1898f2a9
--- /dev/null
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/DownloadHandler.java
@@ -0,0 +1,61 @@
+package ch.ethz.sis.microservices.download.server.services.store;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import ch.ethz.sis.microservices.download.server.logging.LogManager;
+import ch.ethz.sis.microservices.download.server.logging.Logger;
+
+public class DownloadHandler extends AbstractFileServiceHandler
+{
+    private static Logger logger = LogManager.getLogger(DownloadHandler.class);
+
+    @Override
+    protected void success(Path pathToFile, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+    		// Request parameters
+    		String offsetP = request.getParameter("offset");
+    		long offset = 0;
+    		if(offsetP != null) {
+    			offset = Long.parseLong(offsetP);
+    		}
+        
+    		long size = Files.size(pathToFile) - offset;
+    		if(size < 0) {
+    			throw new IllegalArgumentException("offset to read starts beyond end of file");
+    		}
+    		
+    		// Response
+        response.setContentType("application/octet-stream");
+        response.setHeader("Content-Disposition", "attachment; filename=" + pathToFile.getFileName().toString());
+        response.setHeader("Content-Length", Long.toString(Files.size(pathToFile)));
+        
+		InputStream is = Files.newInputStream(pathToFile);
+		is.skip(offset);
+		copy(is, response.getOutputStream(), size);
+        
+        response.setStatus(HttpServletResponse.SC_OK);
+    }
+    
+    private static final int BUFFER_SIZE = 1024;
+    private static void copy(InputStream source, OutputStream destination, long sourceSize) throws IOException {
+    		byte[] buf = new byte[BUFFER_SIZE];
+    		int readed;
+    		while ((readed = source.read(buf)) > 0) {
+    			destination.write(buf, 0, readed);
+    		}
+    }
+
+    @Override
+    protected void failure(Path pathToFile, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+    }
+}
\ No newline at end of file
diff --git a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/DownloadHandlerTest.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/DownloadHandlerTest.java
similarity index 72%
rename from microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/DownloadHandlerTest.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/DownloadHandlerTest.java
index 0fd062dafd96a73b6f9a09ceb28a8c4f79892d0b..6cb1d6c796d8a3c872d52cb19c084a7eba98dc75 100644
--- a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/DownloadHandlerTest.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/DownloadHandlerTest.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.server.services.store;
+package ch.ethz.sis.microservices.download.server.services.store;
 
 public class DownloadHandlerTest
 {
@@ -9,6 +9,7 @@ public class DownloadHandlerTest
                 "http://localhost:8888/openbis/openbis/rmi-application-server-v3",
                 "http://localhost:8080/download",
                 "admin",
-                "admin");
+                "admin",
+                null);
     }
 }
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/DownloadHandlerWithOffsetTest.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/DownloadHandlerWithOffsetTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..12db6ca136e281325565e4d6c13449e13bbcfdf4
--- /dev/null
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/DownloadHandlerWithOffsetTest.java
@@ -0,0 +1,15 @@
+package ch.ethz.sis.microservices.download.server.services.store;
+
+public class DownloadHandlerWithOffsetTest
+{
+
+    public static void main(String[] args) throws Exception
+    {
+        AbstractFileServiceTest.test(
+                "http://localhost:8888/openbis/openbis/rmi-application-server-v3",
+                "http://localhost:8080/download",
+                "admin",
+                "admin",
+                430129557L);
+    }
+}
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/store/FileInfoHandler.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/FileInfoHandler.java
similarity index 66%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/store/FileInfoHandler.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/FileInfoHandler.java
index 016494ca535ea065e5d3ea3b4c9f74a3844ba927..51b4af38fad8fc2a328d0b3abaeacf0cdada68ba 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/store/FileInfoHandler.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/FileInfoHandler.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.server.services.store;
+package ch.ethz.sis.microservices.download.server.services.store;
 
 import java.io.IOException;
 import java.nio.file.Path;
@@ -6,11 +6,12 @@ import java.util.HashMap;
 import java.util.Map;
 
 import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import ch.ethz.sis.microservices.server.json.jackson.JacksonObjectMapper;
-import ch.ethz.sis.microservices.server.logging.LogManager;
-import ch.ethz.sis.microservices.server.logging.Logger;
+import ch.ethz.sis.microservices.download.server.json.jackson.JacksonObjectMapper;
+import ch.ethz.sis.microservices.download.server.logging.LogManager;
+import ch.ethz.sis.microservices.download.server.logging.Logger;
 
 public class FileInfoHandler extends AbstractFileServiceHandler
 {
@@ -35,13 +36,13 @@ public class FileInfoHandler extends AbstractFileServiceHandler
     }
 
     @Override
-    protected void success(Path pathToFile, HttpServletResponse response) throws ServletException, IOException
+    protected void success(Path pathToFile, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {
         writeOutput(response, HttpServletResponse.SC_OK, true);
     }
 
     @Override
-    protected void failure(Path pathToFile, HttpServletResponse response) throws ServletException, IOException
+    protected void failure(Path pathToFile, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {
         writeOutput(response, HttpServletResponse.SC_OK, false);
     }
diff --git a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/FileInfoHandlerTest.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/FileInfoHandlerTest.java
similarity index 68%
rename from microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/FileInfoHandlerTest.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/FileInfoHandlerTest.java
index 0c74198e2930172936b659c7449889469a84d40e..7b3c8c839f2d716ae23a2a67a200585d64666a3c 100644
--- a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/FileInfoHandlerTest.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/services/store/FileInfoHandlerTest.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.server.services.store;
+package ch.ethz.sis.microservices.download.server.services.store;
 
 public class FileInfoHandlerTest
 {
@@ -7,7 +7,8 @@ public class FileInfoHandlerTest
         AbstractFileServiceTest.test(
                 "http://localhost:8888/openbis/openbis/rmi-application-server-v3",
                 "http://localhost:8080/file-information",
-                "juanf",
-                "123");
+                "admin",
+                "admin",
+        			null);
     }
 }
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/util/HttpClient.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/startup/HttpClient.java
similarity index 97%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/util/HttpClient.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/startup/HttpClient.java
index 5e1ef57a354b9fb46c915d2173fdeeccab87ac1b..f4a35f881bfa766deb036c80d6c268cd3598d63b 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/util/HttpClient.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/startup/HttpClient.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.microservices.util;
+package ch.ethz.sis.microservices.download.server.startup;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/startup/Main.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/startup/Main.java
new file mode 100644
index 0000000000000000000000000000000000000000..544ba43ad40ca287ae4d3d38e42ea3c7358937c7
--- /dev/null
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/startup/Main.java
@@ -0,0 +1,40 @@
+package ch.ethz.sis.microservices.download.server.startup;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+import ch.ethz.sis.microservices.download.api.configuration.Config;
+import ch.ethz.sis.microservices.download.server.json.jackson.JacksonObjectMapper;
+import ch.ethz.sis.microservices.download.server.logging.LogManager;
+import ch.ethz.sis.microservices.download.server.logging.Logger;
+import ch.ethz.sis.microservices.download.server.logging.log4j.Log4J2LogFactory;
+
+public class Main
+{
+    static
+    {
+        // Configuring Logging
+        LogManager.setLogFactory(new Log4J2LogFactory());
+    }
+
+    private static Logger logger = LogManager.getLogger(Main.class);
+
+    public static void main(String[] args) throws Exception
+    {
+        logger.info("Current Workspace: " + (new File("").getAbsolutePath()));
+
+        File configFile;
+        if (args.length < 1)
+        {
+            configFile = new File("config.json");
+            logger.info("No arguments given, starting with default config file: " + (configFile.getAbsolutePath()));
+        } else
+        {
+            configFile = new File(args[0]);
+        }
+
+        Config config = JacksonObjectMapper.getInstance().readValue(new FileInputStream(configFile), Config.class);
+        ServerLauncher servicesStarter = new ServerLauncher(config);
+        servicesStarter.getServer().join();
+    }
+}
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/startup/ServerLauncher.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/startup/ServerLauncher.java
similarity index 75%
rename from microservice-server/src/main/java/ch/ethz/sis/microservices/server/startup/ServerLauncher.java
rename to microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/startup/ServerLauncher.java
index e1196a9e23a6b2d6d4bf9034a6e8b47c532dc81e..6f44aa5a3303cda90b082ed5f33ace45698b065f 100644
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/startup/ServerLauncher.java
+++ b/microservice-server/src/main/java/ch/ethz/sis/microservices/download/server/startup/ServerLauncher.java
@@ -1,14 +1,14 @@
-package ch.ethz.sis.microservices.server.startup;
+package ch.ethz.sis.microservices.download.server.startup;
 
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.servlet.ServletHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
 
-import ch.ethz.sis.microservices.api.configuration.Config;
-import ch.ethz.sis.microservices.api.configuration.ServiceConfig;
-import ch.ethz.sis.microservices.server.logging.LogManager;
-import ch.ethz.sis.microservices.server.logging.Logger;
-import ch.ethz.sis.microservices.server.services.Service;
+import ch.ethz.sis.microservices.download.api.configuration.Config;
+import ch.ethz.sis.microservices.download.api.configuration.ServiceConfig;
+import ch.ethz.sis.microservices.download.server.logging.LogManager;
+import ch.ethz.sis.microservices.download.server.logging.Logger;
+import ch.ethz.sis.microservices.download.server.services.Service;
 
 public class ServerLauncher
 {
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/.DS_Store b/microservice-server/src/main/java/ch/ethz/sis/microservices/server/.DS_Store
deleted file mode 100644
index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000
Binary files a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/.DS_Store and /dev/null differ
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/store/DownloadHandler.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/store/DownloadHandler.java
deleted file mode 100644
index 3395c0d1e8398ef7b990f2bc9c8816e3833cbc29..0000000000000000000000000000000000000000
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/services/store/DownloadHandler.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package ch.ethz.sis.microservices.server.services.store;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
-
-import ch.ethz.sis.microservices.server.logging.LogManager;
-import ch.ethz.sis.microservices.server.logging.Logger;
-
-public class DownloadHandler extends AbstractFileServiceHandler
-{
-    private static Logger logger = LogManager.getLogger(DownloadHandler.class);
-
-    @Override
-    protected void success(Path pathToFile, HttpServletResponse response) throws ServletException, IOException
-    {
-        response.setContentType("application/octet-stream");
-        response.setHeader("Content-Disposition", "attachment; filename=" + pathToFile.getFileName().toString());
-        response.setHeader("Content-Length", Long.toString(Files.size(pathToFile)));
-        Files.copy(pathToFile, response.getOutputStream());
-        response.setStatus(HttpServletResponse.SC_OK);
-    }
-
-    @Override
-    protected void failure(Path pathToFile, HttpServletResponse response) throws ServletException, IOException
-    {
-        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-    }
-}
\ No newline at end of file
diff --git a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/startup/Main.java b/microservice-server/src/main/java/ch/ethz/sis/microservices/server/startup/Main.java
deleted file mode 100644
index 9194cdb64d5ec35d4edf8ef7bcc627e9d4593468..0000000000000000000000000000000000000000
--- a/microservice-server/src/main/java/ch/ethz/sis/microservices/server/startup/Main.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package ch.ethz.sis.microservices.server.startup;
-
-import java.io.File;
-import java.io.FileInputStream;
-
-import ch.ethz.sis.microservices.api.configuration.Config;
-import ch.ethz.sis.microservices.server.json.jackson.JacksonObjectMapper;
-import ch.ethz.sis.microservices.server.logging.LogManager;
-import ch.ethz.sis.microservices.server.logging.Logger;
-import ch.ethz.sis.microservices.server.logging.log4j.Log4J2LogFactory;
-
-public class Main
-{
-    static
-    {
-        // Configuring Logging
-        LogManager.setLogFactory(new Log4J2LogFactory());
-    }
-
-    private static Logger logger = LogManager.getLogger(Main.class);
-
-    public static void main(String[] args) throws Exception
-    {
-        logger.info("Current Workspace: " + (new File("").getAbsolutePath()));
-
-        File configFile;
-        if (args.length < 1)
-        {
-            configFile = new File("./conf/config.json");
-            if(configFile.exists()) {
-            		logger.info("No arguments given, starting with default config file: " + (configFile.getAbsolutePath()));
-            } else {
-            		configFile = new File("./config.json");
-            		if(configFile.exists()) {
-                		logger.info("No arguments given, starting with default config file: " + (configFile.getAbsolutePath()));
-                }
-            }
-        } else
-        {
-            configFile = new File(args[0]);
-        }
-
-        Config config = JacksonObjectMapper.getInstance().readValue(new FileInputStream(configFile), Config.class);
-        ServerLauncher servicesStarter = new ServerLauncher(config);
-        servicesStarter.getServer().join();
-    }
-}
diff --git a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/.DS_Store b/microservice-server/src/test/java/ch/ethz/sis/microservices/server/.DS_Store
deleted file mode 100644
index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000
Binary files a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/.DS_Store and /dev/null differ
diff --git a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/.DS_Store b/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/.DS_Store
deleted file mode 100644
index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000
Binary files a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/.DS_Store and /dev/null differ
diff --git a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/.DS_Store b/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/.DS_Store
deleted file mode 100644
index ead2009953af184cbc64f6aa27ab9ecfdc3e0470..0000000000000000000000000000000000000000
Binary files a/microservice-server/src/test/java/ch/ethz/sis/microservices/server/services/store/.DS_Store and /dev/null differ