added application and product
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/.classpath b/plugins/org.eclipse.viatra.modelobfuscator.application/.classpath
new file mode 100644
index 0000000..ad32c83
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/.gitignore b/plugins/org.eclipse.viatra.modelobfuscator.application/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/.project b/plugins/org.eclipse.viatra.modelobfuscator.application/.project
new file mode 100644
index 0000000..42f5271
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.viatra.modelobfuscator.application</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.viatra.modelobfuscator.application/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..c537b63
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/META-INF/MANIFEST.MF b/plugins/org.eclipse.viatra.modelobfuscator.application/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6755e77
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: VIATRA Model Obfuscator Headless
+Bundle-SymbolicName: org.eclipse.viatra.modelobfuscator.application;singleton:=true
+Bundle-Version: 0.7.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.core.runtime,
+ com.google.guava,
+ org.eclipse.viatra.modelobfuscator.runtime
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/build.properties b/plugins/org.eclipse.viatra.modelobfuscator.application/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/emf_configuration_example.properties b/plugins/org.eclipse.viatra.modelobfuscator.application/emf_configuration_example.properties
new file mode 100644
index 0000000..f43ba4a
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/emf_configuration_example.properties
@@ -0,0 +1,13 @@
+# = EMF Obfuscator =
+
+# Select XML mode for obfuscator
+org.eclipse.viatra.modelobfuscator/mode=emf
+
+# Semicolon separated list of Ecore model files that must be loaded into repository (only XMI resources are supported)
+org.eclipse.viatra.modelobfuscator/ecore=someEcore.ecore;otherEcore.ecore
+
+# Semicolon separated list of input instance model files that are obfuscated together
+org.eclipse.viatra.modelobfuscator/input=someModel.ext;otherModel.xmi;someOtherModel.ext
+
+# Select output directory where all obfuscated files are put (input directories will be also recreated inside this)
+org.eclipse.viatra.modelobfuscator/output=someOutputDir
\ No newline at end of file
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/plugin.xml b/plugins/org.eclipse.viatra.modelobfuscator.application/plugin.xml
new file mode 100644
index 0000000..0b79da6
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/plugin.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         id="org.eclipse.viatra.modelobfuscator.application.app"
+         point="org.eclipse.core.runtime.applications">
+      <application
+            cardinality="singleton-global"
+            thread="main"
+            visible="true">
+         <run
+               class="org.eclipse.viatra.modelobfuscator.application.ModelObfuscatorApplication">
+         </run>
+      </application>
+   </extension>
+   <extension
+         id="product"
+         point="org.eclipse.core.runtime.products">
+      <product
+            application="org.eclipse.viatra.modelobfuscator.application.app"
+            name="VIATRA Model Obfuscator">
+      </product>
+   </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/pom.xml b/plugins/org.eclipse.viatra.modelobfuscator.application/pom.xml
new file mode 100644
index 0000000..f5911df
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/pom.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>org.eclipse.viatra.modelobfuscator.parent</artifactId>
+    <groupId>org.eclipse.viatra</groupId>
+    <version>0.7.0-SNAPSHOT</version>
+    <relativePath>../../releng/org.eclipse.viatra.modelobfuscator.parent/pom.xml</relativePath>
+  </parent>
+  <artifactId>org.eclipse.viatra.modelobfuscator.application</artifactId>
+  <packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/src/org/eclipse/viatra/modelobfuscator/application/ModelObfuscatorApplication.java b/plugins/org.eclipse.viatra.modelobfuscator.application/src/org/eclipse/viatra/modelobfuscator/application/ModelObfuscatorApplication.java
new file mode 100644
index 0000000..e97eb1b
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/src/org/eclipse/viatra/modelobfuscator/application/ModelObfuscatorApplication.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2010-2014, Abel Hegedus, Istvan Rath and Daniel Varro
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Abel Hegedus - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.viatra.modelobfuscator.application;
+
+import java.util.Map;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.viatra.modelobfuscator.application.common.ModelObfuscatorHeadless;
+
+/**
+ * @author Abel Hegedus
+ *
+ */
+public class ModelObfuscatorApplication implements IApplication {
+
+    @Override
+    public Object start(IApplicationContext context) throws Exception {
+        @SuppressWarnings("unchecked")
+        Map<String, Object> arguments = context.getArguments();
+        String[] args = (String[]) arguments.get("application.args");
+        
+        try {
+            return new ModelObfuscatorHeadless().performHeadlessObfuscation(args);
+        } catch (IllegalArgumentException e) {
+            System.out.println("Obfuscation failed");
+            return IApplication.EXIT_OK;
+        }
+        
+    }
+
+    @Override
+    public void stop() {
+    
+    }
+
+
+}
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/src/org/eclipse/viatra/modelobfuscator/application/ModelObfuscatorMain.java b/plugins/org.eclipse.viatra.modelobfuscator.application/src/org/eclipse/viatra/modelobfuscator/application/ModelObfuscatorMain.java
new file mode 100644
index 0000000..2c5be21
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/src/org/eclipse/viatra/modelobfuscator/application/ModelObfuscatorMain.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2010-2014, Abel Hegedus, Istvan Rath and Daniel Varro
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Abel Hegedus - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.viatra.modelobfuscator.application;
+
+import org.eclipse.viatra.modelobfuscator.application.common.ModelObfuscatorHeadless;
+
+/**
+ * @author Abel Hegedus
+ *
+ */
+public class ModelObfuscatorMain {
+
+    public static void main(String[] args) {
+        
+        try {
+            new ModelObfuscatorHeadless().performHeadlessObfuscation(args);
+        } catch (IllegalArgumentException e) {
+            System.out.println("Obfuscation failed");
+        }
+        
+    }
+    
+}
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/src/org/eclipse/viatra/modelobfuscator/application/common/ModelObfuscatorHeadless.java b/plugins/org.eclipse.viatra.modelobfuscator.application/src/org/eclipse/viatra/modelobfuscator/application/common/ModelObfuscatorHeadless.java
new file mode 100644
index 0000000..1fae547
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/src/org/eclipse/viatra/modelobfuscator/application/common/ModelObfuscatorHeadless.java
@@ -0,0 +1,351 @@
+/*******************************************************************************
+ * Copyright (c) 2010-2014, Abel Hegedus, Istvan Rath and Daniel Varro
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Abel Hegedus - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.viatra.modelobfuscator.application.common;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.NoSuchElementException;
+import java.util.Properties;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.viatra.modelobfuscator.xml.XMLModelObfuscator;
+import org.eclipse.viatra.modelobfuscator.xml.XMLModelObfuscatorBuilder;
+import org.eclipse.viatra.modelobfuscator.xml.XMLSchemaConfiguration;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Strings;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Sets;
+
+/**
+ * @author Abel Hegedus
+ *
+ */
+public class ModelObfuscatorHeadless {
+
+    /*
+     * Command line parameters 
+     */
+    private static String configParam = "-c";
+    private static String configLongParam = "--config";
+    private static String seedParam   = "-s";
+    private static String saltParam   = "--salt";
+
+    /*
+     * Property keys
+     */
+    private static final String PROPERTY_PREFIX = "org.eclipse.viatra.modelobfuscator/";
+    private static final String OBFUSCATION_MODE_PROPERTY = PROPERTY_PREFIX + "mode";
+    private static final String XML_OBFUSCATION_MODE = "xml";
+    private static final String EMF_OBFUSCATION_MODE= "emf";
+    private static final String OBFUSCATION_INPUT_PROPERTY = PROPERTY_PREFIX + "input";
+    private static final String OBFUSCATION_OUTPUT_PROPERTY = PROPERTY_PREFIX + "output";
+    private static final String OBFUSCATION_ECORE_PROPERTY = PROPERTY_PREFIX + "ecore";
+    private static final String OBFUSCATION_TAGS_PROPERTY = PROPERTY_PREFIX + "tags";
+    private static final String OBFUSCATION_ATTRIBUTES_PROPERTY = PROPERTY_PREFIX + "attributes";
+
+    /**
+     * @param args
+     * @return
+     */
+    public Integer performHeadlessObfuscation(String[] args) {
+        String config = null;
+        String seed = null;
+        String salt = null;
+        
+        if (args == null || args.length == 0) {
+            reportError("Configuration parameter not set");
+        }
+        int i = 0;
+        
+        while (i < args.length) {
+           if (args[i].equals(configLongParam)) {
+               config = args[i + 1];
+                i += 2;
+            } else if (args[i].equals(configParam)) {
+                config = args[i + 1];
+                i += 2;
+            } else if (args[i].equals(seedParam)) {
+                seed = args[i + 1];
+                i += 2;
+            } else if (args[i].equals(saltParam)) {
+                salt = args[i + 1];
+                i += 2;
+            } else {
+                i++;
+            }
+        }
+
+        System.out.println("Obfuscation called with:\n"
+                + "  Config : " + Strings.nullToEmpty(config) + "\n"
+                + "  Seed   : " + Strings.nullToEmpty(seed) + "\n"
+                + "  Salt   : " + Strings.nullToEmpty(salt));
+        
+        if (config == null) {
+            reportError("Configuration parameter not set");
+        }
+
+        Properties configuration = null;
+        // load configuration file
+        try {
+            configuration = loadConfigurationPropertyFile(config);
+        } catch (FileNotFoundException e) {
+            reportError("Could not find configuration file");
+        } catch (IOException e) {
+            reportError("Could not read configuration file");
+        }
+
+        String mode = getPropertyValue(configuration, OBFUSCATION_MODE_PROPERTY);
+        
+        if(mode.equals(EMF_OBFUSCATION_MODE)) {
+            // TODO handle EMF obfuscation
+            
+            // check input file existence
+
+            // ensure output directory existence
+            
+            // load ecore models into registry
+            
+            // load inputs into resource set
+            
+            // initialize obfuscator
+            
+            // perform obfuscation
+            
+            // save models to output directory
+            
+        } else if(mode.equals(XML_OBFUSCATION_MODE)) {
+
+            // ensure output directory existence
+            File outputDirectory = checkOutputDirectory(configuration);
+            
+            // check input file existence
+            Map<String,FileInputStream> inputs = Maps.newHashMap();
+            prepareInputStreams(configuration, inputs);
+            
+            // parse schema configuration
+            XMLSchemaConfiguration schemaConfiguration = prepareSchemaConfiguration(configuration);
+            
+            // initialize obfuscator
+            XMLModelObfuscatorBuilder obfuscatorBuilder = XMLModelObfuscatorBuilder.create().setSchemaConfiguration(schemaConfiguration);
+            
+            if(seed != null) {
+                obfuscatorBuilder.setSeed(seed);
+            }
+            System.out.println("Obfuscating using seed: " + obfuscatorBuilder.getSeed());
+            
+            if(salt != null) {
+                obfuscatorBuilder.setSalt(salt);
+                System.out.println("Obfuscating using salt: " + obfuscatorBuilder.getSalt());
+            }
+            
+            performObfuscation(outputDirectory, inputs, obfuscatorBuilder);
+            
+        } else {
+            reportError("Unknown mode " + mode + " selected in configuration");
+        }
+        
+        return IApplication.EXIT_OK;
+    }
+
+    /**
+     * @param outputDirectory
+     * @param inputs
+     * @param obfuscatorBuilder
+     */
+    private void performObfuscation(File outputDirectory, Map<String, FileInputStream> inputs,
+            XMLModelObfuscatorBuilder obfuscatorBuilder) {
+        for (Entry<String, FileInputStream> input : inputs.entrySet()) {
+            BufferedInputStream bufferedInputStream = new BufferedInputStream(input.getValue());
+            obfuscatorBuilder.setInput(bufferedInputStream);
+            String fileName = input.getKey();
+            File output = new File(outputDirectory, fileName);
+            BufferedOutputStream bufferedOutputStream;
+            try {
+                bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(output));
+                obfuscatorBuilder.setOutput(bufferedOutputStream);
+                XMLModelObfuscator obfuscator = obfuscatorBuilder.build();
+                System.out.println("Obfuscating " + fileName);
+                obfuscator.obfuscate();
+                bufferedOutputStream.close();
+                bufferedInputStream.close();
+            } catch (FileNotFoundException e) {
+                reportError("Could not ouput to file " + output.getPath());
+            } catch (IOException e) {
+                reportError("Could not close output file " + output.getPath());
+            }
+        }
+    }
+
+    private Properties loadConfigurationPropertyFile(String configPath) throws FileNotFoundException, IOException {
+        Properties bundle = new Properties();
+        FileInputStream fis = new FileInputStream(configPath);
+        try {
+            bundle.load(fis);
+        } finally {
+            fis.close();
+        }
+        return bundle;
+    }
+
+    /**
+     * @param configuration
+     */
+    private File checkOutputDirectory(Properties configuration) {
+        String output = getPropertyValue(configuration, OBFUSCATION_OUTPUT_PROPERTY);
+        File outputFile = new File(output);
+        if(!outputFile.exists()) {
+            boolean directoryCreated = outputFile.mkdir();
+            if(!directoryCreated) {
+                reportError("Output " + output + " specified in configuration could not be created");
+            }
+        } else if(!outputFile.isDirectory()) {
+            reportError("Output " + output + " specified in configuration is not a directory");
+        }
+        return outputFile;
+    }
+
+    private void prepareInputStreams(Properties configuration, Map<String, FileInputStream> inputs) {
+        String input = getPropertyValue(configuration, OBFUSCATION_INPUT_PROPERTY);
+        StringTokenizer inputTokenizer = new StringTokenizer(input,";");
+        while (inputTokenizer.hasMoreTokens()) {
+            String inputPath = (String) inputTokenizer.nextToken();
+            // create input stream for input files
+            File file = new File(inputPath);
+            createFileInputStreams(inputs, file);
+        }
+    }
+
+    /**
+     * @param inputs
+     * @param inputPath
+     */
+    private void createFileInputStreams(Map<String, FileInputStream> inputs, File file) {
+        if(!file.exists()) {
+            reportError("Input " + file.getPath() + " specified in configuration could not be found");
+        }
+        if(file.isFile()) {
+            try {
+                FileInputStream fileInputStream = new FileInputStream(file);
+                String fileName = file.getName();
+                if(inputs.containsKey(fileName)) {
+                    reportError("Multiple files with the same name " + fileName + " in configuration");
+                }
+                inputs.put(fileName,fileInputStream);
+            } catch (FileNotFoundException e) {
+                reportError("Input " +  file.getPath() + " specified in configuration could not be found, although it exists");
+            }
+        } else if(file.isDirectory()) {
+            /*
+             * TODO we could support directories, either processing only directly contained files or all transitive
+             * files. However, we would need to take care in putting the directory structure into the output, handle
+             * symbolic and hard links, etc.
+             */
+            reportError("Input" + file.getPath() + " specified in configuration is a directory");
+        }
+    }
+
+    /**
+     * @param configuration
+     * @return
+     */
+    private XMLSchemaConfiguration prepareSchemaConfiguration(Properties configuration) {
+        Optional<String> tags = getOptionalPropertyValue(configuration, OBFUSCATION_TAGS_PROPERTY);
+        Optional<String> attributes = getOptionalPropertyValue(configuration, OBFUSCATION_ATTRIBUTES_PROPERTY);
+        if(!tags.isPresent() && !attributes.isPresent()) {
+            reportError("No schema configuration provided, nothing to obfuscate");
+        }
+        
+        Set<String> tagSet = Sets.newHashSet();
+        if(tags.isPresent()) {
+            StringTokenizer tagTokenizer = new StringTokenizer(tags.get(), ";");
+            while (tagTokenizer.hasMoreTokens()) {
+                String tag = tagTokenizer.nextToken();
+                tagSet.add(tag);
+            }
+        }
+        
+        Multimap<String, String> attributeMultimap = HashMultimap.create();
+        if(attributes.isPresent()) {
+            StringTokenizer attributeTokenizer = new StringTokenizer(attributes.get(), ";");
+            while (attributeTokenizer.hasMoreTokens()) {
+                String tagAttributes = attributeTokenizer.nextToken();
+                try {
+                    StringTokenizer tagAttributeTokenizer = new StringTokenizer(tagAttributes, ":");
+                    String tagName = tagAttributeTokenizer.nextToken();
+                    String attributeList = tagAttributeTokenizer.nextToken();
+                    StringTokenizer attributeListTokenizer = new StringTokenizer(attributeList, ",");
+                    while (attributeListTokenizer.hasMoreTokens()) {
+                        String attributeName = attributeListTokenizer.nextToken();
+                        attributeMultimap.put(tagName, attributeName);
+                    }
+                } catch (NoSuchElementException e) {
+                    reportError("Incorrect syntax in attributes value of schema configuration when processing: " + tagAttributes);
+                }
+            }
+        }
+        
+        XMLSchemaConfiguration schemaConfiguration = new XMLSchemaConfiguration(attributeMultimap, tagSet);
+        return schemaConfiguration;
+    }
+
+    /**
+     * @param configuration
+     * @return
+     */
+    private String getPropertyValue(Properties configuration, String propertyName) {
+        Optional<String> optionalPropertyValue = getOptionalPropertyValue(configuration, propertyName);
+        if(!optionalPropertyValue.isPresent()) {
+            reportError(propertyName + " undefined in configuration");
+        }
+        return optionalPropertyValue.get();
+    }
+    
+    /**
+     * @param configuration
+     * @return
+     */
+    private Optional<String> getOptionalPropertyValue(Properties configuration, String propertyName) {
+        String propertyValue = configuration.getProperty(propertyName);
+        return Optional.fromNullable(propertyValue);
+    }
+
+    /**
+     * @return
+     */
+    private Integer reportError(String message) {
+        System.out.println(message);
+        displayHelp();
+        throw new IllegalArgumentException(message);
+    }
+
+    private void displayHelp() {
+        System.out.println("Usage:\n"
+                + "<call> -c <configurationFilePath> [-s <seed>] [-salt <salt>]\n"
+                + "  -c       : Required, the configuration that describes what to obfuscate.\n"
+                + "  --config : Same as -c.\n"
+                + "  -s       : Optional, the seed used for the obfuscation.\n"
+                + "  --seed   : Same as -s.\n"
+                + "  --salt   : Optional, the salt used for the obfuscation.");
+    }
+    
+}
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.application/xml_configuration_example.properties b/plugins/org.eclipse.viatra.modelobfuscator.application/xml_configuration_example.properties
new file mode 100644
index 0000000..8d79cb7
--- /dev/null
+++ b/plugins/org.eclipse.viatra.modelobfuscator.application/xml_configuration_example.properties
@@ -0,0 +1,18 @@
+# = XML Obfuscator =
+
+# Select XML mode for obfuscator
+org.eclipse.viatra.modelobfuscator/mode=xml
+
+# Provide inputs as semicolon separated list of files
+org.eclipse.viatra.modelobfuscator/input=somefile.ext;c:/someDir/someOtherFile.ex2
+
+# Select output directory where all obfuscated files are put (input directories will be also recreated inside this)
+org.eclipse.viatra.modelobfuscator/output=someOutputDir
+
+# Schema configuration
+# Semicolon separated list of tags whose text content is obfuscated 
+org.eclipse.viatra.modelobfuscator/tags=someTag;otherTag
+
+# Semicolon separated list for tag attributes that are obfuscated
+# (tag name followed by : and comma separated list of attribute names)
+org.eclipse.viatra.modelobfuscator/attributes=someTag:someAttr;otherTag:otherAttr,attr2
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.runtime/.gitignore b/plugins/org.eclipse.viatra.modelobfuscator.runtime/.gitignore
index ae3c172..b33f6af 100644
--- a/plugins/org.eclipse.viatra.modelobfuscator.runtime/.gitignore
+++ b/plugins/org.eclipse.viatra.modelobfuscator.runtime/.gitignore
@@ -1 +1,2 @@
 /bin/
+/xtend-gen/
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/xml/XMLModelObfuscatorBuilder.xtend b/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/xml/XMLModelObfuscatorBuilder.xtend
index a6dd89c..983dafd 100644
--- a/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/xml/XMLModelObfuscatorBuilder.xtend
+++ b/plugins/org.eclipse.viatra.modelobfuscator.runtime/src/org/eclipse/viatra/modelobfuscator/xml/XMLModelObfuscatorBuilder.xtend
@@ -95,6 +95,14 @@
     return this
   }
   
+  def getSeed(){
+    return seedString
+  }
+  
+  def getSalt(){
+    return saltString
+  }
+  
   /**
    * Returns the {@link XMLModelObfuscator} instance built using the current configuration of the builder. 
    */
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/api/.gitignore b/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/api/.gitignore
deleted file mode 100644
index ea7b2b7..0000000
--- a/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/api/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/.DataTypeObfuscator.java._trace
-/.ModelObfuscator.java._trace
-/DataTypeObfuscator.java
-/ModelObfuscator.java
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/emf/simple/.gitignore b/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/emf/simple/.gitignore
deleted file mode 100644
index 3b698f3..0000000
--- a/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/emf/simple/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-/.EMFModelObfuscatorBuilder.java._trace
-/.ResourceFilter.java._trace
-/.SimpleEMFModelObfuscator.java._trace
-/EMFModelObfuscatorBuilder.java
-/ResourceFilter.java
-/SimpleEMFModelObfuscator.java
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/util/.gitignore b/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/util/.gitignore
deleted file mode 100644
index ade536c..0000000
--- a/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/util/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/.StringObfuscator.java._trace
-/StringObfuscator.java
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/xml/.gitignore b/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/xml/.gitignore
deleted file mode 100644
index bde1def..0000000
--- a/plugins/org.eclipse.viatra.modelobfuscator.runtime/xtend-gen/org/eclipse/viatra/modelobfuscator/xml/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-/.XMLModelObfuscator.java._trace
-/.XMLModelObfuscatorBuilder.java._trace
-/.XMLSchemaConfiguration.java._trace
-/XMLModelObfuscator.java
-/XMLModelObfuscatorBuilder.java
-/XMLSchemaConfiguration.java
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.tests/.gitignore b/plugins/org.eclipse.viatra.modelobfuscator.tests/.gitignore
index ae3c172..b33f6af 100644
--- a/plugins/org.eclipse.viatra.modelobfuscator.tests/.gitignore
+++ b/plugins/org.eclipse.viatra.modelobfuscator.tests/.gitignore
@@ -1 +1,2 @@
 /bin/
+/xtend-gen/
diff --git a/plugins/org.eclipse.viatra.modelobfuscator.tests/xtend-gen/org/eclipse/viatra/modelobfuscator/tests/.gitignore b/plugins/org.eclipse.viatra.modelobfuscator.tests/xtend-gen/org/eclipse/viatra/modelobfuscator/tests/.gitignore
deleted file mode 100644
index f822ea9..0000000
--- a/plugins/org.eclipse.viatra.modelobfuscator.tests/xtend-gen/org/eclipse/viatra/modelobfuscator/tests/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/.SimpleEMFModelObfuscatorTest.java._trace
-/.XMLModelObfuscatorTest.java._trace
-/SimpleEMFModelObfuscatorTest.java
-/XMLModelObfuscatorTest.java
diff --git a/releng/org.eclipse.viatra.modelobfuscator.parent/pom.xml b/releng/org.eclipse.viatra.modelobfuscator.parent/pom.xml
index c882c12..5e41322 100644
--- a/releng/org.eclipse.viatra.modelobfuscator.parent/pom.xml
+++ b/releng/org.eclipse.viatra.modelobfuscator.parent/pom.xml
@@ -177,11 +177,13 @@
       </activation>
       <modules>
 	      <module>../../plugins/org.eclipse.viatra.modelobfuscator.ui</module>
+	      <module>../../plugins/org.eclipse.viatra.modelobfuscator.application</module>
 		    <!-- Needs BPM example metamodel as dependency
 		    <module>../../plugins/org.eclipse.viatra.modelobfuscator.tests</module>
 		      -->
         <module>../../features/org.eclipse.viatra.modelobfuscator.feature</module>
         <module>../../releng/org.eclipse.viatra.modelobfuscator.update</module>
+        <module>../../releng/org.eclipse.viatra.modelobfuscator.product</module>
       </modules>
     </profile>
     <profile>
diff --git a/releng/org.eclipse.viatra.modelobfuscator.product/.project b/releng/org.eclipse.viatra.modelobfuscator.product/.project
new file mode 100644
index 0000000..730c3f0
--- /dev/null
+++ b/releng/org.eclipse.viatra.modelobfuscator.product/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.viatra.modelobfuscator.product</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/releng/org.eclipse.viatra.modelobfuscator.product/modelobfuscator.product b/releng/org.eclipse.viatra.modelobfuscator.product/modelobfuscator.product
new file mode 100644
index 0000000..cb33491
--- /dev/null
+++ b/releng/org.eclipse.viatra.modelobfuscator.product/modelobfuscator.product
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="VIATRA Model Obfuscator Product" uid="org.eclipse.viatra.modelobfuscator.product" id="org.eclipse.viatra.modelobfuscator" application="org.eclipse.viatra.modelobfuscator.application.app" version="0.7.0.qualifier" useFeatures="false" includeLaunchers="true">
+
+   <configIni use="default">
+   </configIni>
+
+   <launcherArgs>
+      <programArgs>-consoleLog
+      </programArgs>
+      <vmArgs>-Xms200m -Xmx1024m
+      </vmArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
+      </vmArgsMac>
+   </launcherArgs>
+
+   <windowImages/>
+
+   <launcher>
+      <solaris/>
+      <win useIco="false">
+         <bmp/>
+      </win>
+   </launcher>
+
+   <vm>
+      <windows include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6</windows>
+   </vm>
+
+   <plugins>
+      <plugin id="com.google.guava"/>
+      <plugin id="com.ibm.icu"/>
+      <plugin id="javax.annotation"/>
+      <plugin id="javax.inject"/>
+      <plugin id="javax.xml"/>
+      <plugin id="org.apache.batik.css"/>
+      <plugin id="org.apache.batik.util"/>
+      <plugin id="org.apache.batik.util.gui"/>
+      <plugin id="org.eclipse.ant.core"/>
+      <plugin id="org.eclipse.compare.core"/>
+      <plugin id="org.eclipse.core.commands"/>
+      <plugin id="org.eclipse.core.contenttype"/>
+      <plugin id="org.eclipse.core.databinding"/>
+      <plugin id="org.eclipse.core.databinding.observable"/>
+      <plugin id="org.eclipse.core.databinding.property"/>
+      <plugin id="org.eclipse.core.expressions"/>
+      <plugin id="org.eclipse.core.filesystem"/>
+      <plugin id="org.eclipse.core.filesystem.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.jobs"/>
+      <plugin id="org.eclipse.core.resources"/>
+      <plugin id="org.eclipse.core.resources.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.runtime"/>
+      <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
+      <plugin id="org.eclipse.core.variables"/>
+      <plugin id="org.eclipse.e4.core.commands"/>
+      <plugin id="org.eclipse.e4.core.contexts"/>
+      <plugin id="org.eclipse.e4.core.di"/>
+      <plugin id="org.eclipse.e4.core.di.extensions"/>
+      <plugin id="org.eclipse.e4.core.services"/>
+      <plugin id="org.eclipse.e4.ui.bindings"/>
+      <plugin id="org.eclipse.e4.ui.css.core"/>
+      <plugin id="org.eclipse.e4.ui.css.swt"/>
+      <plugin id="org.eclipse.e4.ui.css.swt.theme"/>
+      <plugin id="org.eclipse.e4.ui.di"/>
+      <plugin id="org.eclipse.e4.ui.model.workbench"/>
+      <plugin id="org.eclipse.e4.ui.services"/>
+      <plugin id="org.eclipse.e4.ui.widgets"/>
+      <plugin id="org.eclipse.e4.ui.workbench"/>
+      <plugin id="org.eclipse.e4.ui.workbench.addons.swt"/>
+      <plugin id="org.eclipse.e4.ui.workbench.renderers.swt"/>
+      <plugin id="org.eclipse.e4.ui.workbench.swt"/>
+      <plugin id="org.eclipse.e4.ui.workbench3"/>
+      <plugin id="org.eclipse.emf.cdo.ecore.retrofit" fragment="true"/>
+      <plugin id="org.eclipse.emf.common"/>
+      <plugin id="org.eclipse.emf.ecore"/>
+      <plugin id="org.eclipse.emf.ecore.change"/>
+      <plugin id="org.eclipse.emf.ecore.xmi"/>
+      <plugin id="org.eclipse.equinox.app"/>
+      <plugin id="org.eclipse.equinox.common"/>
+      <plugin id="org.eclipse.equinox.ds"/>
+      <plugin id="org.eclipse.equinox.preferences"/>
+      <plugin id="org.eclipse.equinox.registry"/>
+      <plugin id="org.eclipse.equinox.util"/>
+      <plugin id="org.eclipse.help"/>
+      <plugin id="org.eclipse.jface"/>
+      <plugin id="org.eclipse.jface.databinding"/>
+      <plugin id="org.eclipse.osgi"/>
+      <plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
+      <plugin id="org.eclipse.osgi.services"/>
+      <plugin id="org.eclipse.swt"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.team.core"/>
+      <plugin id="org.eclipse.ui"/>
+      <plugin id="org.eclipse.ui.trace"/>
+      <plugin id="org.eclipse.ui.workbench"/>
+      <plugin id="org.eclipse.viatra.modelobfuscator.application"/>
+      <plugin id="org.eclipse.viatra.modelobfuscator.runtime"/>
+      <plugin id="org.eclipse.xtend.lib"/>
+      <plugin id="org.eclipse.xtext.xbase.lib"/>
+      <plugin id="org.w3c.css.sac"/>
+      <plugin id="org.w3c.dom.events"/>
+      <plugin id="org.w3c.dom.smil"/>
+      <plugin id="org.w3c.dom.svg"/>
+   </plugins>
+
+   <configurations>
+      <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="0" />
+      <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
+      <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="1" />
+      <plugin id="org.eclipse.osgi" autoStart="true" startLevel="-1" />
+   </configurations>
+
+</product>
diff --git a/releng/org.eclipse.viatra.modelobfuscator.product/pom.xml b/releng/org.eclipse.viatra.modelobfuscator.product/pom.xml
new file mode 100644
index 0000000..7e24c92
--- /dev/null
+++ b/releng/org.eclipse.viatra.modelobfuscator.product/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>org.eclipse.viatra.modelobfuscator.parent</artifactId>
+    <groupId>org.eclipse.viatra</groupId>
+    <version>0.7.0-SNAPSHOT</version>
+    <relativePath>../../releng/org.eclipse.viatra.modelobfuscator.parent/pom.xml</relativePath>
+  </parent>
+  <artifactId>org.eclipse.viatra.modelobfuscator.product</artifactId>
+  <packaging>eclipse-repository</packaging>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-p2-director-plugin</artifactId>
+        <version>${tycho.version}</version>
+        <configuration>
+          <formats>
+            <win32>zip</win32>
+            <linux>tar.gz</linux>
+            <macosx>zip</macosx>
+          </formats>
+        </configuration>
+        <executions>
+          <execution>
+            <id>materialize-products</id>
+            <goals>
+              <goal>materialize-products</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>archive-products</id>
+            <goals>
+              <goal>archive-products</goal>
+            </goals>
+            
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file
diff --git a/releng/org.eclipse.viatra.modelobfuscator.target/org.eclipse.viatra.modelobfuscator.target.target b/releng/org.eclipse.viatra.modelobfuscator.target/org.eclipse.viatra.modelobfuscator.target.target
index b038cbf..0ca1fea 100644
--- a/releng/org.eclipse.viatra.modelobfuscator.target/org.eclipse.viatra.modelobfuscator.target.target
+++ b/releng/org.eclipse.viatra.modelobfuscator.target/org.eclipse.viatra.modelobfuscator.target.target
@@ -16,6 +16,7 @@
     <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
       <unit id="org.eclipse.platform.sdk" version="3.7.2.M20120208-0800"/>
       <unit id="org.eclipse.sdk.ide" version="3.7.2.M20120208-0800"/>
+      <unit id="org.eclipse.equinox.sdk.feature.group" version="3.7.1.R37x_v20110907-7M7W8i8eNV4WsRkue-4Vq4J6pCyW"/>
       <repository location="http://download.eclipse.org/eclipse/updates/3.7"/>
     </location>
     <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">