diff --git a/build.gradle b/build.gradle
index f1fccff554c855b567cf46df42bacd48c961f93b..e32107d9d22970405636c285cfc8b905fac5b899 100644
--- a/build.gradle
+++ b/build.gradle
@@ -57,6 +57,8 @@ sourceSets.main.java.srcDir "src/gen/java"
 dependencies {
 
     implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jackson_version}"
+    implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1'
+
     implementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
     implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.30'
     implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.13.2'
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
index 8d4ff3c44fbc71dfa5a869422434e9fc2a350769..32df0c72edf68516c8177e871f691bb7b8999f05 100644
--- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
+++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
@@ -65,13 +65,21 @@ aspect BalloonExecution{
                   for(Place place:incomingPlaces){
 
                       BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
+                      long i = Long.MAX_VALUE;
+                      int idx = 0;
+                      int idxC = 0;
+                      for(BalloonToken b : bmp.getBalloonMarkingList()){
+                        if(b.getCreationTime() < i){
+                            i = b.getCreationTime();
+                            idx = idxC;
+                        }
+                          idxC++;
+                      }
 
-                      Random rand=new Random();
-                      int randVal=rand.nextInt(bmp.getNumBalloonMarking());
-                      BalloonToken bt=bmp.getBalloonMarking(randVal);
+                      BalloonToken bt=bmp.getBalloonMarking(idx);
 
                       inToken.add(bt);
-                      bmp.getBalloonMarking(randVal).removeSelf();
+                      bmp.getBalloonMarking(idx).removeSelf();
                   }
 
                   BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition);
@@ -125,6 +133,7 @@ aspect BalloonExecution{
                           msg.setData(result.getValue());
                           pub.publish(msg);
                       } else {
+                          result.setCreationTime(System.currentTimeMillis());
                           bmp.getBalloonMarkingList().add(result);
                       }
                   }
@@ -167,7 +176,7 @@ aspect BalloonExecution{
             return storage;
         }
 
-        syn PetriNet PetriNet.registerHandler(String transitionId, int priority, Function<List<BalloonToken>, List<BalloonToken>> processTokenFunction){
+        syn PetriNet PetriNet.registerHandler(String transitionId, int priority, Function<List<Map<String, Object>>, List<Map<String, Object>>> processTokenFunction){
 
             TransitionHandlerService ths = TransitionHandlerService.getInstance();
             ths.registerHandler(this, transitionId, priority, processTokenFunction);
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast b/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast
index fdc8b845207d88599f0dc680cbf4ad8287b453cf..bb8f5022fa42b4fa8ebbda10eba863b38fc9562c 100644
--- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast
+++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast
@@ -6,6 +6,5 @@ rel BalloonTransition.Transition -> Transition;
 abstract TransitionSelectionResult;
 FiringSelectionSuccess : TransitionSelectionResult;
 rel FiringSelectionSuccess.Transition -> Transition;
-// FiringSelectionWait : TransitionSelectionResult ::= <WaitingTime:int>;
 FiringSelectionFail : TransitionSelectionResult;
 FiringSelectionNone : TransitionSelectionResult;
\ No newline at end of file
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag
index 08a9619ab0bbb443f590f9705c3bc2a42de0e580..798b5c33227a81d9f47658b07c2eb4d112c17d4c 100644
--- a/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag
+++ b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag
@@ -51,6 +51,7 @@ aspect BalloonMarking {
 
                     BalloonToken token = new BalloonToken();
                     token.setValue(val);
+                    token.setCreationTime(System.currentTimeMillis());
                     markedPlace.getBalloonMarkingList().add(token);
                 }
 
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast b/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast
index 19651c537cf9167ede18637bce62ab56dd0e69c6..769c695ad6df026ce8ff9fcada1bc85c4c67e70f 100644
--- a/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast
+++ b/src/main/jastadd/engine/balloonMarking/BalloonMarking.relast
@@ -1,5 +1,5 @@
 BalloonMarking ::= PetriNet:PetriNet Place:BalloonMarkedPlace*;
 BalloonMarkedPlace ::= BalloonMarking:BalloonToken*;
-BalloonToken ::= <Value:String>;
+BalloonToken ::= <Value:String> <CreationTime:long>;
 
 rel BalloonMarkedPlace.Place -> Place;
\ No newline at end of file
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java
index 9a5e2db76f4dc91ebf064bb191dcffad11f2ba3b..32be668b7bd75adad9d9270b7a65ea72072fad58 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java
@@ -5,7 +5,7 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
 import java.util.ArrayList;
 import java.util.List;
 
-public class DefaultFinalTransitionHandler extends TransitionHandler{
+public class DefaultFinalTransitionHandler extends TransitionHandler {
 
     public DefaultFinalTransitionHandler(int priority) {
         super(priority, null);
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java
index 72ff59065349a68a5e6682de2da62a3f648ff0be..00ecd1e51713c20cffa98edf8388910b66787c05 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java
@@ -4,7 +4,7 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
 
 import java.util.List;
 
-public class DefaultTransitionHandler extends TransitionHandler{
+public class DefaultTransitionHandler extends TransitionHandler {
 
     public DefaultTransitionHandler(int priority) {
         super(priority, null);
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java
index 1b757765782f94ae61ef020e3b33871f20274c39..b7af8f682441889ed8fdd3f15af49017e76ca973 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java
@@ -1,10 +1,16 @@
 package de.tudresden.inf.st.pnml.engine.execution;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
 import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.lang.reflect.Type;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 import java.util.function.Function;
 
@@ -14,9 +20,9 @@ public class TransitionHandler {
     private final String id;
     private final int priority;
 
-    private Function<List<BalloonToken>, List<BalloonToken>> processTokenFunction;
+    protected Function<List<Map<String, Object>>, List<Map<String, Object>>> processTokenFunction;
 
-    public TransitionHandler(int priority, Function<List<BalloonToken>, List<BalloonToken>> processTokenFunction) {
+    public TransitionHandler(int priority, Function<List<Map<String, Object>>, List<Map<String, Object>>> processTokenFunction) {
         this.id = UUID.randomUUID().toString();
         this.priority = priority;
         this.processTokenFunction = processTokenFunction;
@@ -30,7 +36,32 @@ public class TransitionHandler {
         return priority;
     }
 
-    public List<BalloonToken> processToken(List<BalloonToken> tokens){
-        return processTokenFunction.apply(tokens);
+    private Map<String, Object> parseToken(String s) {
+
+        Gson gson = new GsonBuilder().create();
+        Type mapType = new TypeToken<Map<Integer, Object>>(){}.getType();
+        return gson.fromJson(s, mapType);
+    }
+
+    public List<BalloonToken> processToken(List<BalloonToken> tokens) {
+
+        List<Map<String, Object>> parsedTokens = new ArrayList<>();
+        List<BalloonToken> resultBalloonTokens = new ArrayList<>();
+
+        for (BalloonToken bt : tokens) {
+            Map<String, Object> t = parseToken(bt.getValue());
+            parsedTokens.add(t);
+        }
+
+        List<Map<String, Object>> resultTokens = processTokenFunction.apply(parsedTokens);
+
+        for (Map<String, Object> t : resultTokens) {
+            BalloonToken newBt = new BalloonToken();
+            Gson gson = new GsonBuilder().create();
+            newBt.setValue(gson.toJson(t));
+            resultBalloonTokens.add(newBt);
+        }
+
+        return resultBalloonTokens;
     }
 }
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java
index 4769836f0c53fd34df1d5f97fe93aa4affe1ca13..2884e36637be00ed286ff60830561b6725fb1e4b 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java
@@ -29,7 +29,7 @@ public class TransitionHandlerExecutor {
             if(i < callbacksSorted.size() - 1){
                 outTokens = callbacksSorted.get(i).processToken(outTokens);
             } else {
-                BalloonToken tb = callbacksSorted.get(i).processToken(outTokens).get(0);
+                BalloonToken tb = (BalloonToken) callbacksSorted.get(i).processToken(outTokens).get(0);
                 outTokens = new ArrayList<>();
                 outTokens.add(tb);
             }
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java
index 94de023ace0bfcb5da67ced9c6b0cd034160a21e..61c171562ebde3b6d8d16931a8d33eea85224e3d 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java
@@ -30,7 +30,8 @@ public class TransitionHandlerService {
         balloonCallbackStorages.put(petriNetId, balloonCallbackStorage);
     }
 
-    public void registerHandler(PetriNet petriNet, String transitionId, int priority, Function<List<BalloonToken>, List<BalloonToken>> processTokenFunction){
+    public void registerHandler(PetriNet petriNet, String transitionId, int priority,
+                                Function<List<Map<String, Object>>, List<Map<String, Object>>> processTokenFunction){
 
         TransitionHandler transitionHandler = new TransitionHandler(priority, processTokenFunction);
 
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
index 4c461504e3656c36b9b74bfdf367d28ac35a64c0..ef9086e940c94506c03d56c58735133c129f36b7 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
@@ -163,7 +163,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
                 @Override
                 public void onSuccess(StringServiceResponse stringServiceResponse) {
                     bmpSource.getBalloonMarking(0).removeSelf();
-                    bmpTarget.addBalloonMarking(new BalloonToken(stringServiceResponse.getOutput()));
+                    bmpTarget.addBalloonMarking(new BalloonToken(stringServiceResponse.getOutput(), System.currentTimeMillis()));
                 }
 
                 @Override
@@ -302,7 +302,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
                                 activeServerInstances.add(instanceId);
                                 Place instanceEntryPlace = petriNet.getPlaceById(channelServerResElementMap.
                                         get(resKey).get(0) + "-INSTANCE-" + instanceId);
-                                marking.resolveBalloonPlace(instanceEntryPlace).addBalloonMarking(new BalloonToken(request.getInput()));
+                                marking.resolveBalloonPlace(instanceEntryPlace).addBalloonMarking(new BalloonToken(request.getInput(), System.currentTimeMillis()));
                                 this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE));
                                 break;
                             }