diff --git a/build.gradle b/build.gradle
index 2592345920de6fe207c172efaf8aa9569b1212ab..950173187dc1a7f0f6a8fcc9094fbd1d750afa95 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,7 @@ buildscript {
 }
 
 group 'de.tudresden.inf.st'
-version '0.3'
+version '0.4'
 
 apply plugin: 'java'
 apply plugin: 'java-library'
@@ -44,9 +44,6 @@ configurations {
 }
 
 dependencies {
-
-//    implementation project(':pnml-relast-base')
-
     implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jackson_version}"
     implementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
     implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.30'
@@ -67,7 +64,7 @@ dependencies {
     // https://mvnrepository.com/artifact/xalan/xalan
     implementation group: 'xalan', name: 'xalan', version: '2.7.2'
 
-    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
+    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
     implementation group: 'org.apache.commons', name: 'commons-collections4', version: '4.4'
 
     jastadd2 "org.jastadd:jastadd:2.3.4"
@@ -96,8 +93,31 @@ jar {
 
     duplicatesStrategy = DuplicatesStrategy.EXCLUDE
 
-    archiveBaseName = 'pnml-splitter'
+    archiveBaseName = 'pnml-relast-splitter'
+
+}
+
+task fatJar(type: Jar) {
+    group = "build"
+    archiveAppendix = "fatjar"
+
+    // Include the compiled output and runtime dependencies
+    from sourceSets.main.output
+    from sourceSets.main.allSource
+    from {
+        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
+    }
+
+    // Ensure the correct Main-Class is specified
+    manifest {
+        attributes "Main-Class": "de.tudresden.inf.st.pnml.splitter.Main"
+    }
+
+    // Exclude unnecessary files
+    exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
+    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
 
+    archiveBaseName = 'pnml-relast-splitter'
 }
 
 // Generated files
diff --git a/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java b/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java
index de39f4d618097a7393b58cddc0f3404205112710..10677260fc1eacb927572fa8632270ccbee56feb 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/splitter/Main.java
@@ -8,22 +8,48 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 public class Main {
 
     private static final Logger logger = LoggerFactory.getLogger(Main.class);
 
-    public static void main(String[] args) {
+    // Utility to extract argument value by flag
+    private static String getArgumentValue(String[] args, String flag, String defaultValue) {
+        for (int i = 0; i < args.length; i++) {
+            if (args[i].equals(flag) && i + 1 < args.length) {
+                return args[i + 1];
+            }
+        }
+        return defaultValue;
+    }
+
+    // Print help/usage instructions
+    private static void printUsage() {
+        System.out.println("Options:");
+        System.out.println("  --pnml <path>                     Path to the PNML file (required)");
+        System.out.println("  --help                            Show this help message and exit");
+    }
 
-        String inputPath = (args.length > 0) ? args[0] : null;
+    public static void main(String[] args) {
 
-        if (inputPath == null) {
-            logger.error("No model found on given input path.");
+        if (args.length == 0 || Arrays.asList(args).contains("--help")) {
+            printUsage();
             return;
         }
 
-        List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath);
+        // String configPath = getArgumentValue(args, "--config", null);
+        String pnmlPath = getArgumentValue(args, "--pnml", null);
+
+        // Validate required arguments
+        if (pnmlPath == null) {
+            System.err.println("Error: --pnml <path> is required.");
+            printUsage();
+            System.exit(1);
+        }
+
+        List<PetriNet> petriNets = PnmlParser.parsePnml(pnmlPath, true);
 
         List<List<PetriNet>> disconnectedPetriNets = new ArrayList<>();
         GlobalToLocalNetsPostProcessor processor = new GlobalToLocalNetsPostProcessor();
diff --git a/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java b/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java
index b78d9af64ef2845adeb1dec281f0fcfe11bafc07..47387c7ed37b81a50737a71ad10160763a296a0c 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/splitter/postprocessing/GlobalToLocalNetsPostProcessor.java
@@ -61,7 +61,7 @@ public class GlobalToLocalNetsPostProcessor implements PostProcessor<PetriNet> {
             // filter deep copy elements by location
             for (String location : locations) {
 
-                List<PetriNet> reParsedPetriNets = PnmlParser.parsePnml(serializedNetPath);
+                List<PetriNet> reParsedPetriNets = PnmlParser.parsePnml(serializedNetPath, true);
                 for (PetriNet pn : reParsedPetriNets) {
                     PetriNet separatedNet = createdSeparatedNetByNode(pn, location);
                     separatedNet.setId(separatedNet.getType() + "-" + netSuffix);