diff --git a/app.js b/app.js
index f5031ade65864542bfb0bac3e6e96a5af5eeae7a..f03e3d503f32f95ce8c44e27d2f5a2abc51adb65 100644
--- a/app.js
+++ b/app.js
@@ -2,11 +2,12 @@ var express    = require('express');
 var bodyParser = require('body-parser');
 
 var exec       = require('child_process').exec;
-
+var execSync   = require('child_process').execSync;
 var fs         = require('fs');
 var path       = require('path');
+var fsReaddir = require('fs-readdir');
 var Zip        = require('node-zip');
-var archiver = require('archiver');
+var JSZip = require('jszip');
 
 var exphbs = require('express-handlebars');
 var logger = require('morgan');
@@ -49,20 +50,15 @@ if(typeof checkedFiles !== 'undefined' && checkedFiles.length > 0){
 
 
 app.get('/download', function(req, res){
-
+var promises=[];
 const checkedFiles = req.query.checkedFiles.split(',');
 
-var zip = new Zip();
+var zip = new JSZip();
 // create a file to stream archive data to. 
-var output = fs.createWriteStream(__dirname + 'explorviz-builds.zip');
-
-var archive = archiver('zip', {
-    base64: false, 
-    compression:'DEFLATE',
-    store: true // Sets the compression method to STORE. 
-});
+zip.file("README.txt", "text for README");
 
-archive.append(fs.readFileSync(path.join(__dirname, 'README.txt')), {name: 'README.txt'});
+var frontendFinished = false;
+var backendFinished = false;
 
 //----------------------------------------------------------------backend
 backendChecked = checkedFiles.find(function(file){
@@ -70,10 +66,15 @@ return file === 'explorviz-ui-backend';
 });
 
 if (backendChecked){
+
  const fileName = backendChecked;
  const downloadURL = downloadFiles[backendChecked]; 
- exec('git clone ' + downloadURL + ' ' + fileName + ' && cd ' + fileName + ' && mvn compile war:war ', (error, stdout, stderr) => {
 
+ //exec('git clone ' + downloadURL + ' ' + fileName + ' && cd ' + fileName + ' && mvn compile war:war ', (error, stdout, stderr) => {
+ exec('git pull ' + ' && cd ' + fileName + ' && mvn compile war:war ', (error, stdout, stderr) => {
+
+ promises.push(new Promise(addBackend()));
+   
     var response = 
           'There was an error during your build. ' +
           'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
@@ -86,12 +87,9 @@ if (backendChecked){
 
     console.log(stdout);
     console.log(stderr);
+}); //.then(addBackend()), würde auch gehen (npm packet: exec-then), aber hilft nicht dabei, zu wissen, wann zip gebaut werden darf
 
-    
-    archive.file(fileName + '/target/explorviz-ui-backend-1.0-SNAPSHOT.war', {name:'backend/explorviz-backend.war'});
-    
 
-  });
 } 
 //--------------------------------------------------------------------------------frontend
 
@@ -103,29 +101,31 @@ if (frontendChecked){
  const fileName = frontendChecked;
  const downloadURL = downloadFiles[frontendChecked]; 
 
-exec('git clone ' + downloadURL + ' ' + fileName + ' && cd '+ fileName + ' && npm install', (error, stdout, stderr) => {
-console.log('downloadURL', downloadURL);
-console.log('fileName', fileName);
+//exec('git clone ' + downloadURL + ' ' + fileName + ' && cd '+ fileName + ' && npm install', (error, stdout, stderr) => {
+exec('git pull ', (error, stdout, stderr) => {
+installAddons();
   var response = 
           'There was an error during your build. ' +
           'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
           'and add the following information: ' + error;
-console.log('stdout', stdout);
-console.log('stderr', stderr);
+
     if (error) {
       res.send(response);
       return;
     }
 
+});
+
+};
 
-//Plugins to install?
+function installAddons(){
 
 checkedPlugins = checkedFiles.filter(function(file){
-  
+  return /\bexplorviz-frontend-plugin-\w*/.exec(file);
 });
 
  checkedPlugins.forEach((pluginName) => {
-  exec('ember install'+ downloadFiles[pluginName], (error, stdout, stderr) => {
+  exec('cd ' + 'explorviz-ui-frontend ' + 'ember install ' + downloadFiles[pluginName], (error, stdout, stderr) => {
  
   var response = 
           'There was an error during your build. ' +
@@ -143,16 +143,24 @@ console.log(stderr);
   });
 
 });
+ buildFrontend();
+};
 
+
+function buildFrontend(){
+	console.log('buildFrontend()');
 //build everything you have
-exec('ember build --environment production', (error, stdout, stderr) => {
+exec('cd explorviz-ui-frontend && ember build --environment=production', (error, stdout, stderr) => {
+//exec('cd explorviz-ui-frontend', (error, stdout, stderr) => {
+
+var frontendP = new Promise(addFrontend(resolve,reject)); 
+ promises.push(frontendP);
 
   var response = 
           'There was an error during your build. ' +
           'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
           'and add the following information: ' + error;
-console.log('stdout', stdout);
-console.log('stderr', stderr);
+
     if (error) {
       res.send(response);
       return;
@@ -162,34 +170,90 @@ console.log(stdout);
 console.log(stderr);
 
 
- }); // ------------------------------------------ember build
-});
-archive.directory('dist/', {name: 'frontend/dist'});
+ });
+ }; // ------------------------------------------ember build
 
-}
 
-//create zip and download it
+function addBackend(){
+// read a file as a stream and add it to a zip
+console.log('addBackend()');
+const backendStream = fs.createReadStream("explorviz-ui-backend/target/explorviz-ui-backend-1.0-SNAPSHOT.war");
+zip.file("backend.war", backendStream);
+backendFinished = true;
+createZip();
+};
 
-// listen for all archive data to be written 
-output.on('close', function() {
-  console.log(archive.pointer() + ' total bytes');
-  console.log('archiver has been finalized and the output file descriptor has closed.');
-});
- 
-// good practice to catch this error explicitly 
-archive.on('error', function(err) {
-  throw err;
+function addFrontend(resolve,reject){
+	console.log("in addFrontend");
+
+var stream = fsReaddir('./explorviz-ui-frontend/dist/')
+.on('error', function(err) {
+  console.log('error:', err);
+}).on('data', function(data){
+	
+	for (var i=0; i<data.length; i++) {
+		const frontendStream = fs.createReadStream(data[i]);
+		zip.file(data[i], frontendStream);
+}
+
+}).on('finish',function(){
+	frontendFinished = true;
+	//return printFinished();
 });
+console.log('stream',stream);	
+};
 
-archive.pipe(output);
-      archive.finalize();
+function printFinished(resolve,reject){
+console.log('frontendFinished');
+}
 
+console.log('promises' ,promises);
+console.log('promises.length', promises.length);
+if (promises.length){
+Promise.all(promises).then(function createZip(){
+	console.log('frontendFinished', frontendFinished);
+	console.log('backendFinished', backendFinished);
+	//if(frontendFinished){
+		// if (frontendChecked){
+		// 	if (backendChecked){
+		// 		if(frontendFinished && backendFinished){
+		// 			console.log('both');
+//create zip and download it
+    zip.generateNodeStream({type:'nodebuffer',streamFiles:true}).pipe(fs.createWriteStream('explorviz-builds.zip')).on('finish', function () {
+    // JSZip generates a readable stream with a "end" event,
+    // but is piped here in a writable stream which emits a "finish" event.
+    console.log("explorviz-builds.zip written.");
+    res.download('explorviz-builds.zip');
+}); 
+//} 
 
-      
-      
-        res.download('explorviz-builds.zip');
+});
+}
+// } else if (frontendFinished) {//!backendChecked
+// 	console.log('frontend only');
+// zip.generateNodeStream({type:'nodebuffer',streamFiles:true}).pipe(fs.createWriteStream('explorviz-builds.zip')).on('finish', function () {
+//     // JSZip generates a readable stream with a "end" event,
+//     // but is piped here in a writable stream which emits a "finish" event.
+//     console.log("explorviz-builds.zip frontend only written.");
+//     res.download('explorviz-builds.zip');
+// });}
+    
 
+// } else if (backendChecked){//!frontendChecked
+// 	if (backendFinished){
+// 		console.log('backend only');
+// 		//create zip and download it
+//     zip.generateNodeStream({type:'nodebuffer',streamFiles:true}).pipe(fs.createWriteStream('explorviz-builds.zip')).on('finish', function () {
+//     // JSZip generates a readable stream with a "end" event,
+//     // but is piped here in a writable stream which emits a "finish" event.
+//     console.log("explorviz-builds.zip backend only written.");
+//     res.download('explorviz-builds.zip');
+// });
+// 	}
+// }
+// }
 });
 
+
 app.listen(8080);
 console.log("Downloader started on port 8080.");
\ No newline at end of file
diff --git a/package.json b/package.json
index 50fde87c75013e5d17d432075404e2cf5c3b9f78..dc1464f06a4699315c39712328ed9e87adb91ad1 100644
--- a/package.json
+++ b/package.json
@@ -9,17 +9,19 @@
   "author": "explorviz-developers-request@listserv.dfn.de",
   "license": "Apache-2.0",
   "dependencies": {
-    "adm-zip": "^0.4.7",
-    "archiver": "^1.3.0",
     "body-parser": "^1.17.1",
     "child_process": "^1.0.2",
     "cookie-parser": "^1.4.3",
     "express": "^4.15.2",
     "express-handlebars": "^3.0.0",
     "fs": "0.0.1-security",
+    "fs-readdir": "0.0.3",
+    "jszip": "^3.1.3",
     "morgan": "^1.8.2",
     "node-zip": "^1.1.1",
-    "path": "^0.12.7",
-    "archiver": "^1.3.0"
+    "path": "^0.12.7"
+  },
+  "devDependencies": {
+    "ember-cli-test-plugin": "git+https://github.com/ExplorViz/explorviz-frontend-plugin-example.git"
   }
 }