diff --git a/.gitignore b/.gitignore
index 92222168397e2ebdfeea8e9e74ae0b36abd03c52..a73255afd1615af09b43eaad0a3b47f9bc3c9092 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,6 @@
 *.war
 *.class
 *.sublime-workspace
-.vagrant/
\ No newline at end of file
+.vagrant/
+.release/
+/*.tar.gz
\ No newline at end of file
diff --git a/make-release.sh b/make-release.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8d4459fc9f159622d276c1978b0866eb3ac6a92e
--- /dev/null
+++ b/make-release.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+VERSION=$(git describe --tags --abbrev=0 2> /dev/null)
+if [ $? -ne 0 ]; then
+	VERSION=$(git rev-parse --short HEAD 2> /dev/null)
+fi
+
+if [ -z $VERSION ]; then
+	echo "could not get version"
+	exit 1
+fi
+
+DIR="$(dirname "$(readlink -f "$0")")"
+REL_NAME="vipra-$VERSION"
+REL="$DIR/$REL_NAME"
+
+rm -rf $REL $REL.tar.gz
+mkdir -p $REL/vipra-backend $REL/vipra-cmd $REL/vipra-ui
+cp -r $DIR/dtm_release $REL/dtm_release
+find $REL -type f -name "*.o" -exec rm -f {} \;
+rm -f $REL/dtm_release/dtm/main
+cp $DIR/vipra-backend/target/vipra.war $REL/vipra-backend
+cp $DIR/vipra-cmd/target/*.jar $REL/vipra-cmd/vipra.jar
+cp -r $DIR/vipra-cmd/target/lib $REL/vipra-cmd/lib
+cp -r $DIR/vipra-ui/public $REL/vipra-ui
+cp $DIR/vipra $REL/vipra-cmd/vipra
+cp $DIR/LICENSE $DIR/README.md $REL
+
+tar zcf $REL_NAME.tar.gz $REL_NAME
+rm -rf $REL
+
+echo "$REL_NAME.tar.gz"
+exit 0
\ No newline at end of file
diff --git a/vipra-cmd/runcfg/CMD.launch b/vipra-cmd/runcfg/CMD.launch
index 23d3254f3b652c3a87b318f3dbd0cb2636ee147d..bb49f0c227cd9feb1a48dc4db8f8ff5a9beabf34 100644
--- a/vipra-cmd/runcfg/CMD.launch
+++ b/vipra-cmd/runcfg/CMD.launch
@@ -11,7 +11,7 @@
 </listAttribute>
 <stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="de.vipra.cmd.Main"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-dl"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-CS test -C asd"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="vipra-cmd"/>
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
 <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea"/>
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/CommandLineOptions.java b/vipra-cmd/src/main/java/de/vipra/cmd/CommandLineOptions.java
index f75c615d0a3bbe569be0b0f8cac50905180f6fa8..4ce7824862b41f916a378c2c92f9b642ddf621f1 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/CommandLineOptions.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/CommandLineOptions.java
@@ -1,5 +1,8 @@
 package de.vipra.cmd;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.DefaultParser;
 import org.apache.commons.cli.HelpFormatter;
@@ -12,20 +15,27 @@ public class CommandLineOptions {
 	public static final Option CLEAR = Option.builder("c").longOpt("clear").desc("clear the database and models").build();
 	public static final Option DEBUG = Option.builder("d").longOpt("debug").desc("show debug information").build();
 	public static final Option HELP = Option.builder("h").longOpt("help").desc("show this help").build();
-	public static final Option INDEX = Option.builder("i").longOpt("index").desc("create the search index on selected models").build();
 	public static final Option LIST = Option.builder("l").longOpt("list").desc("list available models").build();
-	public static final Option REREAD = Option.builder("r").longOpt("reread").desc("reread generated models").build();
 	public static final Option SILENT = Option.builder("s").longOpt("silent").desc("suppress all output").build();
 	public static final Option TEST = Option.builder("t").longOpt("test").desc("test database connections").build();
-	public static final Option ALL = Option.builder("A").longOpt("all").desc("select all models, short for -S all").build();
-	public static final Option CREATE = Option.builder("C").longOpt("create").desc("create new models").hasArgs().argName("models...").build();
-	public static final Option DELETE = Option.builder("D").longOpt("delete").desc("delete existing models").hasArgs().argName("models...").build();
-	public static final Option EDIT = Option.builder("E").longOpt("edit").desc("edit config of selected models").hasArgs().argName("models...")
-			.build();
-	public static final Option PRINT = Option.builder("p").longOpt("print").desc("print model configuration").hasArgs().argName("models...").build();
-	public static final Option IMPORT = Option.builder("I").longOpt("import").desc("import data from json into selected models").hasArgs()
-			.argName("files...").build();
-	public static final Option MODEL = Option.builder("M").longOpt("model").desc("generate topics on selected models").build();
+	public static final Option ALL = Option.builder("A").longOpt("all").desc("select all models (-S all)c").build();
+
+	public static final Option INDEX = Option.builder("i").longOpt("index").desc("create index for models").hasArgs().argName("[models...]")
+			.optionalArg(true).build();
+	public static final Option REREAD = Option.builder("r").longOpt("reread").desc("reread generated models").hasArgs().argName("[models...]")
+			.optionalArg(true).build();
+	public static final Option CREATE = Option.builder("C").longOpt("create").desc("create new models").hasArgs().argName("[models...]")
+			.optionalArg(true).build();
+	public static final Option DELETE = Option.builder("D").longOpt("delete").desc("delete existing models").hasArgs().argName("[models...]")
+			.optionalArg(true).build();
+	public static final Option EDIT = Option.builder("E").longOpt("edit").desc("edit config of selected models").hasArgs().argName("[models...]")
+			.optionalArg(true).build();
+	public static final Option PRINT = Option.builder("p").longOpt("print").desc("print model configuration").hasArgs().argName("[models...]")
+			.optionalArg(true).build();
+	public static final Option IMPORT = Option.builder("I").longOpt("import").desc("import data for models").hasArgs().argName("[models...]")
+			.optionalArg(true).build();
+	public static final Option MODEL = Option.builder("M").longOpt("model").desc("generate topics on models").hasArgs().argName("[models...]")
+			.optionalArg(true).build();
 	public static final Option SELECT = Option.builder("S").longOpt("select").desc("select models").hasArgs().argName("models...").build();
 
 	private final Options options;
@@ -41,7 +51,20 @@ public class CommandLineOptions {
 	}
 
 	public void parse(final String[] args) throws ParseException {
-		cmd = new DefaultParser().parse(options, args);
+		cmd = new DefaultParser().parse(options, split(args));
+	}
+
+	private String[] split(final String[] args) {
+		final List<String> args2 = new ArrayList<>();
+		for (String arg : args) {
+			if (arg.startsWith("-") && arg.length() > 2) {
+				for (char c : arg.substring(1, arg.length()).toCharArray())
+					args2.add("-" + c);
+			} else {
+				args2.add(arg);
+			}
+		}
+		return args2.toArray(new String[args2.size()]);
 	}
 
 	public boolean hasOption(final Option opt) {
@@ -78,6 +101,9 @@ public class CommandLineOptions {
 	}
 
 	public String[] modelsToIndex() {
+		final String[] models = getOptionValues(INDEX);
+		if (models != null && models.length > 0)
+			return models;
 		return selectedModels();
 	}
 
@@ -90,6 +116,9 @@ public class CommandLineOptions {
 	}
 
 	public String[] modelsToReread() {
+		final String[] models = getOptionValues(REREAD);
+		if (models != null && models.length > 0)
+			return models;
 		return selectedModels();
 	}
 
@@ -110,7 +139,10 @@ public class CommandLineOptions {
 	}
 
 	public String[] modelsToCreate() {
-		return getOptionValues(CREATE);
+		final String[] models = getOptionValues(CREATE);
+		if (models != null && models.length > 0)
+			return models;
+		return selectedModels();
 	}
 
 	public boolean isDelete() {
@@ -118,7 +150,10 @@ public class CommandLineOptions {
 	}
 
 	public String[] modelsToDelete() {
-		return getOptionValues(DELETE);
+		final String[] models = getOptionValues(DELETE);
+		if (models != null && models.length > 0)
+			return models;
+		return selectedModels();
 	}
 
 	public boolean isEdit() {
@@ -126,7 +161,10 @@ public class CommandLineOptions {
 	}
 
 	public String[] modelsToEdit() {
-		return getOptionValues(EDIT);
+		final String[] models = getOptionValues(EDIT);
+		if (models != null && models.length > 0)
+			return models;
+		return selectedModels();
 	}
 
 	public boolean isPrint() {
@@ -134,7 +172,10 @@ public class CommandLineOptions {
 	}
 
 	public String[] modelsToPrint() {
-		return getOptionValues(PRINT);
+		final String[] models = getOptionValues(PRINT);
+		if (models != null && models.length > 0)
+			return models;
+		return selectedModels();
 	}
 
 	public boolean isImport() {
@@ -142,7 +183,10 @@ public class CommandLineOptions {
 	}
 
 	public String[] filesToImport() {
-		return getOptionValues(IMPORT);
+		final String[] models = getOptionValues(IMPORT);
+		if (models != null && models.length > 0)
+			return models;
+		return selectedModels();
 	}
 
 	public boolean isModel() {
@@ -150,6 +194,9 @@ public class CommandLineOptions {
 	}
 
 	public String[] modelsToModel() {
+		final String[] models = getOptionValues(MODEL);
+		if (models != null && models.length > 0)
+			return models;
 		return selectedModels();
 	}
 
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/CreateModelCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/CreateModelCommand.java
index 320cc47e873047c5195e3d1156426bef233c469b..e029235085ae5fa63efbfcc5ea125c62f9a0c362 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/CreateModelCommand.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/CreateModelCommand.java
@@ -4,7 +4,6 @@ import java.io.File;
 import java.io.IOException;
 
 import com.fasterxml.jackson.core.JsonGenerationException;
-import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 
 import de.vipra.util.Config;
@@ -24,12 +23,6 @@ public class CreateModelCommand implements Command {
 		this.names = names;
 	}
 
-	private void restoreModelFromDir(final String name, final File modelDir)
-			throws JsonParseException, JsonMappingException, IOException, DatabaseException {
-		final TopicModelConfig modelConfig = TopicModelConfig.readFromFile(modelDir);
-		createModel(name, modelConfig, modelDir);
-	}
-
 	private void createModel(final String name, final TopicModelConfig modelConfig, final File modelDir)
 			throws JsonGenerationException, JsonMappingException, IOException, DatabaseException {
 		modelConfig.setName(name);
@@ -60,13 +53,7 @@ public class CreateModelCommand implements Command {
 				throw new Exception("invalid model name: " + name);
 			final File modelDir = new File(config.getDataDirectory(), name);
 			if (modelDir.exists()) {
-				try {
-					final TopicModelFull topicModel = dbTopicModels.getSingle(name);
-					if (topicModel != null)
-						throw new Exception("model with that name already exists: " + name);
-				} catch (final Exception e) {}
-				restoreModelFromDir(name, modelDir);
-				ConsoleUtils.info("model restored: " + name);
+				ConsoleUtils.info("model already exists: " + name);
 				continue;
 			}
 			if (!modelDir.mkdirs())
diff --git a/vipra-ui/gulpfile.js b/vipra-ui/gulpfile.js
index 9f8e6da50ca7f17b34422d683b204b313eeb77ed..168bf714915f8f9867b5e3f07c67d2b3b889fac0 100644
--- a/vipra-ui/gulpfile.js
+++ b/vipra-ui/gulpfile.js
@@ -61,7 +61,7 @@ gulp.task('js', function() {
 });
 
 gulp.task('js-rel', function() {
-  gulp.src(['app/js/**/*.js', '!app/js/config.js', '!app/js/dev.js'])
+  gulp.src(['app/js/**/*.js', '!app/js/config.js'])
     .pipe(concat('app.js'))
     .pipe(ngannotate())
     .pipe(gulp.dest('public/js'));