diff --git a/build.gradle b/build.gradle
index a93b679957abb184804226e8a8adb757fc2ba49e..4c1ac5edabe59b8118e9c9252bdb13137f901acd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -56,7 +56,8 @@ dependencies {
     api group: 'fr.lip6.pnml', name: 'fr.lip6.pnml.framework.utils', version: '2.2.12'
     implementation group: 'org.apache.ws.commons.axiom', name: 'axiom-api', version: '1.2.22'
     implementation group: 'org.apache.ws.commons.axiom', name: 'axiom-impl', version: '1.2.22'
-    implementation group: 'com.thaiopensource', name: 'jing', version: '20091111'
+    implementation group: 'com.thaiopensourc' +
+            'e', name: 'jing', version: '20091111'
     implementation 'org.jetbrains:annotations:19.0.0'
     // https://mvnrepository.com/artifact/xalan/xalan
     implementation group: 'xalan', name: 'xalan', version: '2.7.2'
@@ -68,9 +69,9 @@ dependencies {
     implementation 'com.google.code.gson:gson:2.9.0'
 
     jastadd2 "org.jastadd:jastadd:2.3.4"
-  //  relast group: 'org.jastadd', name: 'relast', version: "${relast_version}"
+    relast group: 'org.jastadd', name: 'relast', version: "${relast_version}"
     ecore files("libs/ecore2relast-0.1.jar")
-    relast files("libs/relast.jar")
+ //   relast files("libs/relast.jar")
 
     testImplementation('org.junit.jupiter:junit-jupiter:5.8.2')
 
@@ -107,7 +108,7 @@ def ecoreInputFiles = [ecoreFile]
 def ecoreOutputFiles = [ecoreRelastAspect,
                         ecoreRelastGrammar]
 
-def relastInputFiles = [ecoreRelastGrammar, './src/main/jastadd/base/marking/Marking.relast', './src/main/jastadd/base/io/IoPN.relast', './src/main/jastadd/base/clauses/expressions.relast']
+def relastInputFiles = [ecoreRelastGrammar, './src/main/jastadd/base/marking/Marking.relast', './src/main/jastadd/engine/balloonMarking/BalloonMarking.relast', './src/main/jastadd/base/io/IoPN.relast', './src/main/jastadd/base/clauses/expressions.relast']
 def relastOutputFiles = ['src/gen/jastadd/pnml/placeTransition.ast', 'src/gen/jastadd/pnml/placeTransition.jadd']
 
 task ecoreToRelast(type: JavaExec) {
diff --git a/gradle.properties b/gradle.properties
index 20d0d23d81035dbcbb94c5c4a4ce3ade419644ca..d51a5f5997f156fb8cd9c468e2804eed1477e5c8 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,3 +1,3 @@
 jackson_version = 2.9.8
 apache_httpcomponents_version = 4.5.8
-relast_version = 0.3.0-137
\ No newline at end of file
+relast_version = 0.4.0
\ No newline at end of file
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..a5659cabd5e7317dc27960dad697873b0b3e619a
--- /dev/null
+++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
@@ -0,0 +1,3 @@
+aspect BalloonExecution {
+
+}
\ No newline at end of file
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..cee2ae35037c41356325d740308ea7674332391c
--- /dev/null
+++ b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag
@@ -0,0 +1,75 @@
+aspect BalloonMarking {
+
+    public BalloonMarking PetriNet.initialBalloonMarking(PetriNet pn) throws IOException, SAXException, ParserConfigurationException {
+
+        BalloonMarking marking = new BalloonMarking();
+        marking.setPetriNet(pn);
+
+        for (Place place : allPlaces()) {
+
+            BalloonMarkedPlace markedPlace = new BalloonMarkedPlace();
+            markedPlace.setPlace(place);
+
+            for(String val : de.tudresden.inf.st.pnml.engine.parsing.BalloonTokenParsing.parseBalloonPlaceMarkingToolSpecifics(place)){
+
+                BalloonToken token = new BalloonToken();
+                token.setValue(val);
+                markedPlace.getBalloonMarkingList().add(token);
+            }
+        }
+
+        return marking;
+    }
+
+    syn BalloonMarkedPlace BalloonMarking.resolvePlace(Place place) = balloonPlaceMap().get(place);
+
+    syn lazy java.util.Map<Place, BalloonMarkedPlace> BalloonMarking.balloonPlaceMap() {
+
+        java.util.Map<Place, BalloonMarkedPlace> map = new java.util.HashMap<>();
+
+        for (BalloonMarkedPlace markedPlace : getPlaceList()) {
+            map.put(markedPlace.getPlace(), markedPlace);
+        }
+        return map;
+    }
+
+    syn BalloonMarkedPlace BalloonMarking.resolvePlaceById(String placeID) {
+
+        for (BalloonMarkedPlace markedPlace : getPlaceList()) {
+            if(markedPlace.getPlace().getId().equals(placeID)){
+                return markedPlace;
+            }
+        }
+        return null;
+    }
+
+    syn java.util.List<String> BalloonMarking.marking(Place place) {
+
+        java.util.List<String> marking = new ArrayList<>();
+            for(BalloonToken bt : resolvePlace(place).getBalloonMarkingList()){
+                marking.add(bt.getValue());
+            }
+        return marking;
+    }
+
+    syn boolean BalloonMarking.isEnabled(Transition t) {
+
+        for (Place place : t.incomingPlaces()) {
+            if (marking(place).size() == 0) return false;
+        }
+        return true;
+    }
+
+    syn boolean BalloonMarking.isDead() {
+
+        for (Transition transition : getPetriNet().allTransitions()) {
+            if (isEnabled(transition)) return false;
+        }
+        return true;
+    }
+
+    syn java.util.Set<Transition> BalloonMarking.enabledTransitions()
+        = getPetriNet().allTransitions().stream()
+        .filter(t -> isEnabled(t))
+        .collect(Collectors.toSet());
+}
\ No newline at end of file
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast b/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast
new file mode 100644
index 0000000000000000000000000000000000000000..19651c537cf9167ede18637bce62ab56dd0e69c6
--- /dev/null
+++ b/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast
@@ -0,0 +1,5 @@
+BalloonMarking ::= PetriNet:PetriNet Place:BalloonMarkedPlace*;
+BalloonMarkedPlace ::= BalloonMarking:BalloonToken*;
+BalloonToken ::= <Value:String>;
+
+rel BalloonMarkedPlace.Place -> Place;
\ No newline at end of file
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonConstants.java b/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonConstants.java
new file mode 100644
index 0000000000000000000000000000000000000000..19e67db3abc04e854dee8cf4860117394b2e829a
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonConstants.java
@@ -0,0 +1,9 @@
+package de.tudresden.inf.st.pnml.engine.parsing;
+
+public abstract class BalloonConstants {
+
+    public static final String BALLOON_MARKING = "balloonMarking";
+    public static final String BALLOON_PLACE_ID = "placeId";
+    public static final String BALLOON_TOKENS = "tokens";
+    public static final String BALLOON_TOKEN = "token";
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonTokenParsing.java b/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonTokenParsing.java
new file mode 100644
index 0000000000000000000000000000000000000000..5bc590b7c0a3ce6815599772a12cf47a2205acba
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/parsing/BalloonTokenParsing.java
@@ -0,0 +1,53 @@
+package de.tudresden.inf.st.pnml.engine.parsing;
+
+import de.tudresden.inf.st.pnml.jastadd.model.Place;
+import de.tudresden.inf.st.pnml.jastadd.model.ToolInfo;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class BalloonTokenParsing {
+
+    public static List<String> parseBalloonPlaceMarkingToolSpecifics(Place place) throws ParserConfigurationException, IOException, SAXException {
+
+        List<String> marking = new ArrayList<>();
+
+        for (ToolInfo ti : place.getToolspecifics()) {
+            if (ti.getFormattedXMLBuffer().lastIndexOf(BalloonConstants.BALLOON_MARKING) == -1) {
+
+                StringBuffer toolInfoStringBuffer = ti.getFormattedXMLBuffer();
+
+                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+
+                Document doc = dBuilder.parse(fromStringBuffer(toolInfoStringBuffer));
+                doc.getDocumentElement().normalize();
+
+                org.w3c.dom.NodeList tokensList = doc.getElementsByTagName(BalloonConstants.BALLOON_TOKENS);
+
+                for (int i = 0; i < tokensList.getLength(); i++) {
+
+                    for (int j = 0; j < tokensList.item(i).getChildNodes().getLength(); j++)
+
+                        if (tokensList.item(i).getChildNodes().item(j).getNodeName().equals(BalloonConstants.BALLOON_TOKEN)) {
+                            marking.add(tokensList.item(i).getChildNodes().item(j).getTextContent());
+                        }
+                }
+                break;
+            }
+        }
+        return marking;
+    }
+
+    private static InputStream fromStringBuffer(StringBuffer buf) {
+        return new ByteArrayInputStream(buf.toString().getBytes());
+    }
+}