diff --git a/docker/docker-run.sh b/docker/docker-run.sh
index 645fd946e3bb5fb83258edb73092ad193368ab4a..3a03cf84e6569335765664e3a584f31384abb79f 100755
--- a/docker/docker-run.sh
+++ b/docker/docker-run.sh
@@ -26,4 +26,4 @@ if [ $REPLACE_WEBROOT -eq 1 ]; then
 	VOLUME_WEBROOT="-v $DIR/webroot:/webroot"
 fi
 
-docker run -d $PORT_MAPPING $VOLUME_WEBAPPS $VOLUME_WEBROOT -v $DIR/logs:/tomcat/logs eikecochu/vipra
\ No newline at end of file
+echo docker run -d $PORT_MAPPING $VOLUME_WEBAPPS $VOLUME_WEBROOT -v $DIR/logs:/tomcat/logs eikecochu/vipra
diff --git a/vipra-cmd/runcfg/CMD.launch b/vipra-cmd/runcfg/CMD.launch
index bee7078bfab75ad04d237aa2164895de91ae036e..2748817dbefc9e12dbe0bb6a11af817c60c599de 100644
--- a/vipra-cmd/runcfg/CMD.launch
+++ b/vipra-cmd/runcfg/CMD.launch
@@ -11,7 +11,6 @@
 </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="-S test2 -dcI /home/eike/repos/master/ma-impl/docker/data/test-1.json"/>
 <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 23a021709650a87db646b18c757e01f2079aeceb..493f2c823568cc80cd157a9f799973237e56817c 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/CommandLineOptions.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/CommandLineOptions.java
@@ -22,7 +22,6 @@ public class CommandLineOptions {
 	public static final Option VERSION = Option.builder("v").longOpt("version").desc("print the version number").build();
 	public static final Option PERF = Option.builder("p").longOpt("perf").desc("generate performance statistics").hasArg().optionalArg(true)
 			.argName("file").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...]")
@@ -48,6 +47,8 @@ public class CommandLineOptions {
 	public static final Option RESTORE = Option.builder("R").longOpt("restore").desc("restore data/filebase").hasArg().argName("file").build();
 	public static final Option LOG = Option.builder("o").longOpt("out").desc("print output to file").hasArg().optionalArg(true).argName("file")
 			.build();
+	public static final Option CONFIG = Option.builder("f").longOpt("config").desc("choose a custom config file").hasArg().argName("file/name")
+			.build();
 
 	private final Options options;
 	private CommandLine cmd;
@@ -55,7 +56,7 @@ public class CommandLineOptions {
 
 	public CommandLineOptions() {
 		final Option[] optionsArray = { ERASE, DEBUG, HELP, INDEX, LIST, REREAD, SILENT, TEST, ALL, CREATE, DELETE, EDIT, PRINT, IMPORT, MODEL,
-				RENAME, CLEAR, SELECT, BACKUP, RESTORE, VERSION, PERF, LOG };
+				RENAME, CLEAR, SELECT, BACKUP, RESTORE, VERSION, PERF, LOG, CONFIG };
 		options = new Options();
 		for (final Option option : optionsArray)
 			options.addOption(option);
@@ -287,6 +288,14 @@ public class CommandLineOptions {
 		return getOptionValue(LOG);
 	}
 
+	public boolean isConfig() {
+		return hasOption(CONFIG);
+	}
+
+	public String configString() {
+		return getOptionValue(CONFIG);
+	}
+
 	private static String[] stripGroups(final String[] names) {
 		if (names == null)
 			return null;
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/Main.java b/vipra-cmd/src/main/java/de/vipra/cmd/Main.java
index 85315441c3f7237c709361a8f18ea07daa9b0dcf..18c52caa424913e058de010d429ada746c3f9302 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/Main.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/Main.java
@@ -97,6 +97,10 @@ public class Main {
 			return;
 		}
 
+		// config
+
+		Config.configString = opts.configString();
+
 		// commands
 
 		final List<Command> commands = new ArrayList<>();
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java
index 14455611bf62a0d4dbd036f4a77137a5eaef144e..9af93956f2632d71edcd8ae0dcd1bbd140b1f99a 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java
@@ -28,7 +28,7 @@ public class TestCommand implements Command {
 
 			// test if configuration readable
 			ConsoleUtils.infoNOLF(" " + ConsoleUtils.PATH_T + " reading configuration...");
-			final Config config = Config.getConfig(true);
+			final Config config = Config.getConfig(false);
 			ConsoleUtils.print(Ansi.ansi().fg(Color.GREEN).a("OK").reset().toString());
 
 			// test if dtm is accessible
diff --git a/vipra-util/src/main/java/de/vipra/util/Config.java b/vipra-util/src/main/java/de/vipra/util/Config.java
index 7c7fe7e08bce278382310456ef247c9a27ab07c7..cd708b2f65b7e5221a0c916593d60163d0b9abd5 100644
--- a/vipra-util/src/main/java/de/vipra/util/Config.java
+++ b/vipra-util/src/main/java/de/vipra/util/Config.java
@@ -1,9 +1,11 @@
 package de.vipra.util;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -31,6 +33,8 @@ public class Config {
 	public static final Logger log = LoggerFactory.getLogger(Config.class);
 	public static final ObjectMapper mapper = new ObjectMapper();
 
+	public static String configString = null;
+
 	static {
 		mapper.enable(SerializationFeature.INDENT_OUTPUT);
 		mapper.enable(Feature.ALLOW_COMMENTS);
@@ -247,31 +251,46 @@ public class Config {
 	}
 
 	public static Config getConfig() throws ConfigException {
-		return getConfig(false);
+		return getConfig(configString, true);
+	}
+
+	public static Config getConfig(final boolean readModels) throws ConfigException {
+		return getConfig(configString, readModels);
 	}
 
-	public static Config getConfig(final boolean skipModels) throws ConfigException {
+	public static Config getConfig(final String configStr, final boolean readModels) throws ConfigException {
 		if (instance == null) {
 			try {
 				InputStream in = null;
+				final File configDir = getGenericConfigDir();
+				if (!configDir.exists()) {
+					configDir.mkdirs();
+				}
+
+				final List<File> files = new ArrayList<>();
+
+				// custom config file or name
+				if (configStr != null) {
+					files.addAll(Arrays.asList(new File(configStr), new File(configDir, configStr), new File(configDir, configStr + ".json")));
+				}
 
 				// config from environment
 				final String configPath = System.getenv("VIPRA_CONFIG");
 				if (configPath != null && configPath.length() > 0) {
-					final File file = new File(configPath);
-					if (file.exists() && file.isFile()) {
-						in = org.apache.commons.io.FileUtils.openInputStream(file);
-					}
+					files.addAll(Arrays.asList(new File(configPath), new File(configPath, Constants.CONFIG_FILE)));
 				}
 
 				// config from generic config dir
-				final File configDir = getGenericConfigDir();
-				if (!configDir.exists()) {
-					configDir.mkdirs();
-				}
 				final File configFile = new File(configDir, Constants.CONFIG_FILE);
-				if (configDir != null && configDir.exists() && configDir.isDirectory() && configFile.exists() && configFile.isFile())
-					in = org.apache.commons.io.FileUtils.openInputStream(configFile);
+				files.add(configFile);
+
+				// check locations
+				for (final File file : files) {
+					if (file.exists() && file.isFile() && file.canRead()) {
+						in = new FileInputStream(file);
+						break;
+					}
+				}
 
 				// config from source
 				if (in == null) {
@@ -280,11 +299,13 @@ public class Config {
 
 				if (in == null) {
 					log.error("config file input stream is null");
-					throw new ConfigException("config file input stream is null");
+					throw new ConfigException("could not find any config file");
 				}
 
 				// load config
 				final String config = IOUtils.toString(in);
+
+				// write generic config
 				if (configDir.exists() && !configFile.exists())
 					org.apache.commons.io.FileUtils.write(configFile, config);
 
@@ -293,15 +314,8 @@ public class Config {
 				if (instance == null)
 					throw new ConfigException("could not read configuration");
 
-				// read topic model configs
-				if (!skipModels) {
-					final MongoService<TopicModelFull, ObjectId> dbTopicModels = MongoService.getDatabaseService(instance, TopicModelFull.class);
-					final List<TopicModelFull> topicModels = dbTopicModels.getAll("_all");
-					final Map<String, TopicModelConfig> topicModelConfigs = new HashMap<>(topicModels.size());
-					for (final TopicModelFull topicModel : topicModels)
-						topicModelConfigs.put(topicModel.getName(), topicModel.getModelConfig());
-					instance.setTopicModelConfigs(topicModelConfigs);
-				}
+				if (readModels)
+					instance.rereadTopicModelConfigs();
 			} catch (final IOException e) {
 				throw new ConfigException(e);
 			}
@@ -310,6 +324,19 @@ public class Config {
 		return instance;
 	}
 
+	public void rereadTopicModelConfigs() throws ConfigException {
+		if (instance == null)
+			throw new ConfigException("config not initialized");
+
+		// read topic model configs
+		final MongoService<TopicModelFull, ObjectId> dbTopicModels = MongoService.getDatabaseService(instance, TopicModelFull.class);
+		final List<TopicModelFull> topicModels = dbTopicModels.getAll("_all");
+		final Map<String, TopicModelConfig> topicModelConfigs = new HashMap<>(topicModels.size());
+		for (final TopicModelFull topicModel : topicModels)
+			topicModelConfigs.put(topicModel.getName(), topicModel.getModelConfig());
+		setTopicModelConfigs(topicModelConfigs);
+	}
+
 	public String validModelName(String name) throws ConfigException {
 		name = name.trim().toLowerCase();
 		if (name.equals("all"))