diff --git a/.gitignore b/.gitignore
index cd735ac33958271dab56a2cb5af864401b4f6ecb..2dc5300c2337379329a657033bc9fba2854e782b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,7 @@
 /tmp
 /explorviz-ui-backend
 /explorviz-ui-frontend
+/explorviz-backend-plugin-example
 explorviz-builds.zip
 
 # dependencies
diff --git a/app.js b/app.js
index 485a3e4f7d77b3d1b6d4b7c8b9e2f5cc7429d486..b8911bd09864297e95b7dbf0c75add1892badc7e 100644
--- a/app.js
+++ b/app.js
@@ -1,52 +1,52 @@
-	var express    = require('express');
-	var bodyParser = require('body-parser');
+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 JSZip = require('jszip');
+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 JSZip = require('jszip');
 
-	var exphbs = require('express-handlebars');
+var exphbs = require('express-handlebars');
 
-	//initializer
-	var nanit = require('nanit');
-	//load names of available download files
-	const downloadFiles = require('./downloadFiles.json');
-	const downloadNames = Object.keys(downloadFiles);
+//initializer
+var initGitRepos = require('./initializers/gitRepos.js');
+//load names of available download files
+const downloadFiles = require('./downloadFiles.json');
+const downloadNames = Object.keys(downloadFiles);
 
-	var app = express();
+//load functions for frontend and backend build
+let backendFunctions = require('./backendFunctions.js');
+let frontendFunctions = require('./frontendFunctions.js');
+let zipFunctions = require('./zipFunctions.js');
 
-	app.use(bodyParser.urlencoded({
-		extended: true
-	}));
-	app.use(bodyParser.json());
+var app = express();
+
+app.use(bodyParser.urlencoded({
+	extended: true
+}));
+app.use(bodyParser.json());
 
 	//set handlebars as view engine
 	app.engine('.hbs', exphbs({extname: '.hbs'}));
 	app.set('view engine', '.hbs');
 
-	//initialize the git repos
-	//TODO error handling is not working properly, error returned is not in let error, but in req + req and res are undefined!
+	
 	//TODO add spinner for telling user to wait until initialization is done
-// 	nanit.initialize(downloadFiles, function(req,res,err){
-// 	// console.log('err in nanit.initialize:', err);
-// 	// console.log('req in nanit.initialize:', req);
-// 	// console.log('res in nanit.initialize:', res);
-
-// 	let response = 
-// 	'There was an error during cloning the git repositories. ' +
-// 	'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
-// 	'and add the following information: ' + req;
-// 	if(err){
-// 		console.log('nanit.initialize error');
-// 		res.send(response);
-// 		return;
-// 	};
-
-// });
+	
+	//TODO clone the git repos: function initialize here (for better understanding) or in gitRepos.js defined?
+	//Clone the git repos initially for performance.
+	// function initialize(downloadFiles){
+	// 	return initGitRepos.initBackend(downloadFiles).then(function(downloadFiles){
+	// 		return initGitRepos.initBackendPlugins(downloadFiles).then(function(downloadFiles){
+	// 			return initGitRepos.initFrontend(downloadFiles)
+	// 		})
+	// 	})
+	// };
+
+	//initGitRepos.initialize(downloadFiles);
 
 	//routes
 	app.get('/', function(req, res){
@@ -71,10 +71,7 @@
 		const promiseArray = []
 		const checkedFiles = req.query.checkedFiles.split(',');
 
-	// create a file to stream archive data to. 
-	const zip = new JSZip();
-	zip.file("README.txt", "text for README");
-
+	
 
 	backendChecked = checkedFiles.find(function(file){
 		return file === 'explorviz-ui-backend';
@@ -83,117 +80,27 @@
 	if (backendChecked){
 
 		const fileName = backendChecked;
-		const downloadURL = downloadFiles[backendChecked]; 
-
-
-		function backendClean(){
-			console.log('in backendClean');
-			return new Promise((resolve,reject)=>{
-				exec('cd explorviz-ui-backend/plugins/net/explorviz/ && rm -rf plugins/*', (error, stdout,stderr)=>{
-					if (error) {
-						reject(error);
-						return;
-					}
-
-					console.log(stdout);
-					console.log(stderr);
-
-					resolve();
-
-				})
-			})
-		}
-
-		function backendPull(){
-			console.log('in backendPull');
-			return new Promise((resolve, reject)=> {
-
-				exec('cd ' + fileName + ' git pull ', (error, stdout, stderr) => {
-
-					if (error) {
-						reject(error);
-						return;
-					}
-
-					console.log(stdout);
-					console.log(stderr);
-
-					resolve();
-
-				}); 
-			})
-			
-		}
-
-
-		function backendInstallAddons(){
-			console.log('in backendInstallAddons');
-			return new Promise((resolve, reject)=>{
-				checkedPlugins = checkedFiles.filter(function(file){
-					return /\bexplorviz-backend-plugin-\w*/.exec(file);
-				});
-
-				if(checkedPlugins.length !== 0 ){
-
-					checkedPlugins.forEach((pluginName) => {
-						exec('git clone ' + downloadFiles[pluginName] + ' && cd '+ pluginName +  ' && cp -R ' + ' . '+' ../explorviz-ui-backend/plugins/net/explorviz/plugins/ ', (error, stdout, stderr) => { //'cd explorviz-ui-backend/plugins/net/explorviz/plugins/ ' + 
-							
-							if (error) {
-								reject(error);
-								return;
-							}
-
-							console.log(stdout);
-							console.log(stderr);
-							
-							resolve();
-
-						});
-
-					})
-				} else {
-					resolve();
-				}
-
-			})
-
-
-		}
-
-		function backendBuild(){
-			console.log('in backendBuild');
-			return new Promise((resolve,reject)=>{
-				exec('cd '+ fileName + ' && mvn compile war:war ', (error,stdout,stderr)=> {
-					if (error) {
-						reject(error);
-						return;
-					}
-
-					console.log(stdout);
-					console.log(stderr);
-					resolve({zipFileName:'backend.war', path:'explorviz-ui-backend/target/explorviz-ui-backend-1.0-SNAPSHOT.war'});
-
-
-				})
-
-			})
-
-
-		}
 
 		function backendAll(){
-			return backendClean().then(function(){
-				return backendPull().then(function(){
-					return backendInstallAddons().then(function(){
-						return backendBuild()
+			return backendFunctions.backendClean(fileName).then(function(){
+				return backendFunctions.backendPull(fileName).then(function(){
+					return backendFunctions.backendInstallAddons(checkedFiles,downloadFiles).then(function(){
+						return backendFunctions.backendBuild(fileName)
 					})
 				})
+			}).catch(function(error){
+				let response = 
+				'There was an error during your backend build. ' +
+				'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
+				'and add the following information: ' + error;
+				res.send(response);
+
 			})
 
 		}
 		promiseArray.push(backendAll());
-		console.log('promiseArray:', promiseArray);
-		finalizeZip();
+		console.log('promiseArray in backendChecked:', promiseArray);
+		finalizeZip(promiseArray);
 		
 	} 
 
@@ -205,123 +112,45 @@
 		const fileName = frontendChecked;
 		const downloadURL = downloadFiles[frontendChecked]; 
 
-		function frontendPull(){
-
-			return new Promise((resolve, reject) => {
-				console.log('in frontendPull()');
-				//' git fetch origin && git reset --hard origin/master '
-				exec('cd ' +  fileName + ' git checkout package.json && npm prune ' +' && git pull ', (error, stdout, stderr) => {
-
-					if (error) {
-						reject(error)
-						return;
-					}
-
-					console.log(stdout);
-					console.log(stderr);
-					resolve();
-				});
-			})
-		} 
-
-		function frontendInstallAddons(){
-			console.log('in frontendInstallAddons()');
-			return new Promise((resolve, reject) => {
-
-				checkedPlugins = checkedFiles.filter(function(file){
-					return /\bexplorviz-frontend-plugin-\w*/.exec(file);
-				});
-
-				if(checkedPlugins.length !== 0 ){
-
-					checkedPlugins.forEach((pluginName) => {
-						exec('cd ' + ' explorviz-ui-frontend ' + ' ember install ' + downloadFiles[pluginName], (error, stdout, stderr) => {
-							
-							if (error) {
-								reject(error);
-								return;
-							}
-
-							console.log(stdout);
-							console.log(stderr);
-							
-							resolve();
-
-						});
-
-					})
-				} else {
-					resolve();
-				}
-
-			})
-		}  
-
-		function frontendBuild(){
-
-			return new Promise((resolve,reject)=> {
-				console.log('in frontendBuild()');
-
-
-				exec('cd ' + fileName +' && ember build --environment=production', (error, stdout, stderr) => {
-
-					if (error) {
-						reject(error);
-						return;
-					}
-
-					console.log(stdout);
-					console.log(stderr);
-
-					resolve({zipFileName:'frontend', path:'./explorviz-ui-frontend/dist/'});
-				});
-
-
-
-			})
-			console.log('resolve build:', resolve);
-		}
-
 		function frontendAll() {
-
-			return frontendPull().then(function(){
-				return frontendInstallAddons().then(function(){
-					return frontendBuild()
+			return frontendFunctions.frontendClean(fileName).then(function(){
+				return frontendFunctions.frontendPull(fileName).then(function(){
+					return frontendFunctions.frontendInstallAddons(checkedFiles, downloadFiles).then(function(){
+						return frontendFunctions.frontendBuild(fileName)
+					})
 				})
+			}).catch(function(error){
+				let response = 
+				'There was an error during your frontend build. ' +
+				'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
+				'and add the following information: ' + error;
+				res.send(response);
+
 			})
 		}
 //frontend was selected and the next step (streaming to zip) has to wait until the frontend is built
 promiseArray.push(frontendAll());
-finalizeZip();
+finalizeZip(promiseArray);
 
 };
 
+//TODO put all zip-things in zipFunctions.js;
+//problem: createZip has to know the res from /download-route and if just the other functions will be exported, the zip has to be passed to createZip with resolve()
+// create a file to stream archive data to. 
+const zip = new JSZip();
+zip.file("README.txt", "text for README");
 
 
-function finalizeZip(){
-	
-	return streamFilesToZip().then(function(){
-		return createZip()
-	}).catch(function(error) {let response = 
-		'There was an error during your build. ' +
-		'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
-		'and add the following information: ' + error;
-		res.send(response);
-	})
-
-}
-
-function streamFilesToZip(){
+function streamFilesToZip(promiseArray){
 	console.log('in streamFilesToZip');
 
 	return new Promise((resolve,reject)=> {
-		console.log('promiseArray:', promiseArray);
+		console.log('promiseArray in streamFilesToZip before Promise.all:', promiseArray);
 		Promise.all(promiseArray).then(files => {
-			console.log('in Promise.all');
+			console.log('in Promise.all, files:', files);
 			let finishedArray=[];
 			files.forEach(file => {
 				if (file.zipFileName === 'backend.war'){
-					console.log('in backend.war');
 
 					fs.readFileAsync = function(filePath){
 						return new Promise(function (resolve, reject) {
@@ -336,13 +165,14 @@ function streamFilesToZip(){
 						});
 					}
 
+
 					function addBackendToZip(data){
 						return new Promise(function(resolve,reject){
 							zip.file(file.zipFileName, data);
 							resolve();
 						})
 					}
-
+					console.log('in backend.war');
 
 					backendContent = fs.readFileAsync(file.path);
 					backendContent.then(function(data){
@@ -353,6 +183,7 @@ function streamFilesToZip(){
 					})
 
 					if(finishedArray.length === files.length){
+						console.log('before resolve() in backend.war');
 						resolve();
 					}
 
@@ -375,7 +206,6 @@ function streamFilesToZip(){
 							resolve();
 						}
 					})
-					console.log('frontendStream:', frontendStream);
 
 				}
 
@@ -389,6 +219,19 @@ function streamFilesToZip(){
 	})
 };
 
+function finalizeZip(promiseArray){
+	
+	return streamFilesToZip(promiseArray).then(function(){
+		return createZip()
+	}).catch(function(error) {let response = 
+		'There was an error during your build. ' +
+		'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
+		'and add the following information: ' + error;
+		res.send(response);
+	})
+
+}
+
 function createZip(){
 	console.log('in createZip');
 	
@@ -406,11 +249,8 @@ function createZip(){
 }
 
 
-
-
-
 });
 
 
-	app.listen(3000);
-	console.log("Downloader started on port 3000.");
\ No newline at end of file
+app.listen(3000);
+console.log("Downloader started on port 3000.");
\ No newline at end of file
diff --git a/backendFunctions.js b/backendFunctions.js
new file mode 100644
index 0000000000000000000000000000000000000000..ec9ec54a73cf240019641fd446fd9e488eac73e8
--- /dev/null
+++ b/backendFunctions.js
@@ -0,0 +1,107 @@
+var express    = require('express');
+var exec       = require('child_process').exec;		
+
+function backendClean(fileName){
+	console.log('in backendClean');
+
+	return new Promise((resolve,reject)=>{
+		exec('cd explorviz-ui-backend/plugins/net/explorviz/ && rm -rf plugins/*', (error, stdout,stderr)=>{
+
+			if (error) {
+				reject(error);
+				return;
+			}
+
+			console.log(stdout);
+			console.log(stderr);
+
+			resolve(fileName);
+
+		})
+	})
+}
+
+function backendPull(fileName){
+	console.log('in backendPull');
+	return new Promise((resolve, reject)=> {
+
+		exec('cd ' + fileName + ' git pull ', (error, stdout, stderr) => {
+
+			if (error) {
+				reject(error);
+				return;
+			}
+
+			console.log(stdout);
+			console.log(stderr);
+
+			resolve();
+
+		}); 
+	})
+
+}
+
+function backendInstallAddons(checkedFiles,downloadFiles){
+	console.log('in backendInstallAddons');
+	return new Promise((resolve, reject)=>{
+		checkedPlugins = checkedFiles.filter(function(file){
+			return /\bexplorviz-backend-plugin-\w*/.exec(file);
+		});
+
+		if(checkedPlugins.length !== 0 ){
+
+			checkedPlugins.forEach((pluginName) => {
+				//TODO want to copy everything in backend-plugin except .git, workaround: ./demo/
+						exec('cd '+ pluginName + ' git pull ' + ' && cp -R ' + ' ./demo/ '+' ../explorviz-ui-backend/plugins/net/explorviz/plugins/ ', (error, stdout, stderr) => { //'cd explorviz-ui-backend/plugins/net/explorviz/plugins/ ' + 
+							
+							if (error) {
+								reject(error);
+								return;
+							}
+
+							console.log(stdout);
+							console.log(stderr);
+							
+							resolve();
+
+						});
+
+					})
+		} else {
+			resolve();
+		}
+
+	})
+
+
+}
+function backendBuild(fileName){
+	console.log('in backendBuild');
+	return new Promise((resolve,reject)=>{
+		exec('cd '+ fileName + ' && mvn compile war:war ', (error,stdout,stderr)=> {
+			if (error) {
+				reject(error);
+				return;
+			}
+
+			console.log(stdout);
+			console.log(stderr);
+			resolve({zipFileName:'backend.war', path:'explorviz-ui-backend/target/explorviz-ui-backend-1.0-SNAPSHOT.war'});
+
+
+		})
+
+	})
+
+
+}
+
+module.exports = {
+	backendClean,
+	backendPull,
+	backendInstallAddons,
+	backendBuild
+
+
+}
\ No newline at end of file
diff --git a/frontendFunctions.js b/frontendFunctions.js
new file mode 100644
index 0000000000000000000000000000000000000000..948c9cd7a733164b33f4b13bec0a15a17a7dbc3e
--- /dev/null
+++ b/frontendFunctions.js
@@ -0,0 +1,106 @@
+	let express    = require('express');
+	let exec       = require('child_process').exec;		
+
+	function frontendClean(fileName){
+	return new Promise((resolve, reject) => {
+			console.log('in frontendClean()');
+				//' git fetch origin && git reset --hard origin/master '
+				exec('cd ' +  fileName + ' git checkout package.json && npm prune ', (error, stdout, stderr) => {
+
+					if (error) {
+						reject(error)
+						return;
+					}
+
+					console.log(stdout);
+					console.log(stderr);
+					resolve();
+				});
+			})
+
+	}
+
+
+	function frontendPull(fileName){
+
+		return new Promise((resolve, reject) => {
+			console.log('in frontendPull()');
+				//' git fetch origin && git reset --hard origin/master '
+				exec('cd ' +  fileName + ' git checkout package.json && npm prune ' +' && git pull ', (error, stdout, stderr) => {
+
+					if (error) {
+						reject(error)
+						return;
+					}
+
+					console.log(stdout);
+					console.log(stderr);
+					resolve();
+				});
+			})
+	} 
+
+	function frontendInstallAddons(checkedFiles, downloadFiles){
+		console.log('in frontendInstallAddons()');
+		return new Promise((resolve, reject) => {
+
+			checkedPlugins = checkedFiles.filter(function(file){
+				return /\bexplorviz-frontend-plugin-\w*/.exec(file);
+			});
+
+			if(checkedPlugins.length !== 0 ){
+
+				checkedPlugins.forEach((pluginName) => {
+					exec('cd ' + ' explorviz-ui-frontend ' + ' ember install ' + downloadFiles[pluginName], (error, stdout, stderr) => {
+
+						if (error) {
+							reject(error);
+							return;
+						}
+
+						console.log(stdout);
+						console.log(stderr);
+
+						resolve();
+
+					});
+
+				})
+			} else {
+				resolve();
+			}
+
+		})
+	}
+
+	function frontendBuild(fileName){
+
+		return new Promise((resolve,reject)=> {
+			console.log('in frontendBuild()');
+
+
+			exec('cd ' + fileName +' && ember build --environment=production', (error, stdout, stderr) => {
+
+				if (error) {
+					reject(error);
+					return;
+				}
+
+				console.log(stdout);
+				console.log(stderr);
+
+				resolve({zipFileName:'frontend', path:'./explorviz-ui-frontend/dist/'});
+			});
+
+
+
+		})
+		console.log('resolve build:', resolve);
+	}
+
+	module.exports = {
+		frontendClean,
+		frontendPull,
+		frontendInstallAddons,
+		frontendBuild
+	}
diff --git a/initializers/gitRepos.js b/initializers/gitRepos.js
index 25380fca30b47c72ba7cf7ed8d8b860b9ecad06e..1f35ed391c9cafe9c2cfc3787514d2ef33e15fd3 100644
--- a/initializers/gitRepos.js
+++ b/initializers/gitRepos.js
@@ -1,37 +1,102 @@
 var express    = require('express');
 var exec       = require('child_process').exec;
 
+  //Clone the git repos initially for performance.
+  function initialize(downloadFiles){
+    return initBackend(downloadFiles).then(function(downloadFiles){
+      return initBackendPlugins(downloadFiles).then(function(downloadFiles){
+        return initFrontend(downloadFiles)
+      })
+    })
+  };
 
-//Clone the git repos initially for performance.
-//TODO error handling is not working properly, error returned is not in var error, but in req
-function initGitRepos(downloadFiles, next){
+
+function initBackend(downloadFiles){
   const backendName= 'explorviz-ui-backend';
-  const downloadBackend= downloadFiles[backendName];
-exec('git clone ' + downloadBackend, (error, stdout, stderr) => {
-  
-    if (error) {
-      console.log('initGitRepos: backendFailed');
-      return next(error);
-    }
-
-    console.log(stdout);
-    console.log(stderr);
-});
+  const downloadBackendURL = downloadFiles[backendName];
+
+  return new Promise((resolve,reject)=>{
+    exec('git clone ' + downloadBackendURL + ' '+ backendName, (error, stdout, stderr) => {
+
+      if (error) {
+        console.log('initGitRepos: backendFailed ->', error);
+        reject(error);
+        return;
+      }
+
+      console.log(stdout);
+      console.log(stderr);
+    });
+    resolve(downloadFiles);
+
+  });
+}
+
+function initBackendPlugins(downloadFiles){
+ downloadNames = Object.keys(downloadFiles);
  
- const frontendName='explorviz-ui-frontend';
- const downloadFrontend= downloadFiles[frontendName];
- exec('git clone ' + downloadFrontend + ' ' + frontendName + ' && cd '+ frontendName + ' && npm install', (error, stdout, stderr) => {
-  
-    if (error) {
-      console.log('initGitRepos: frontendFailed');
-          return next(error);
-    }
+  const backendPlugins = downloadNames.filter(function(file){
+    return /\bexplorviz-backend-plugin-\w*/.exec(file);
+  });
+
+  return new Promise((resolve, reject) => {
+   if(backendPlugins.length !== 0 ){
+
+    backendPlugins.forEach((pluginName) => {
+      exec('git clone ' + downloadFiles[pluginName], (error, stdout, stderr) => {
+
+        if (error) {
+          reject(error);
+          return;
+        }
+
+        console.log(stdout);
+        console.log(stderr);
+
+        resolve(downloadFiles);
 
-    console.log(stdout);
-    console.log(stderr);
-});
+      });
 
+    })
+  } else {
+    resolve(downloadFiles);
+  }
+
+})
+
+
+
+}
+
+function initFrontend(downloadFiles){
+
+  return new Promise((resolve,reject)=>{
+
+    const frontendName ='explorviz-ui-frontend';
+    const downloadFrontendURL = downloadFiles[frontendName];
+    exec('git clone ' + downloadFrontendURL + ' ' + frontendName + ' && cd '+ frontendName + ' && npm install', (error, stdout, stderr) => {
+
+      if (error) {
+        console.log('initGitRepos: frontendFailed ->', error);
+        reject(error);
+        return;
+      }
+
+      console.log(stdout);
+      console.log(stderr);
+    });
+    resolve();
+    
+  })
 
-next();
 };
-module.exports = initGitRepos;
\ No newline at end of file
+
+
+// module.exports = {
+//   initBackend,
+//   initBackendPlugins,
+//   initFrontend
+// }
+module.exports = {
+  initialize
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index c1386eab031fcd9f33c3a19fb510bdd77a24efbc..8f08ffd0020dd951ed998c3cd81ac2a10580a39c 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,6 @@
     "fs": "0.0.1-security",
     "fs-readdir": "0.0.3",
     "jszip": "^3.1.3",
-    "nanit": "^0.3.1",
     "node-zip": "^1.1.1",
     "path": "^0.12.7"
   },