From df2d3798cac990381f4329580597f5ffddadaaae Mon Sep 17 00:00:00 2001
From: SebastianEbert <sebastian.ebert@tu-dresden.de>
Date: Mon, 27 Jun 2022 17:13:27 +0200
Subject: [PATCH] worked on callbacks, dineros node concept

---
 build.gradle                                  |  36 ++-
 libs/rosgraph_msgs-1.10.12.jar                | Bin 0 -> 1938 bytes
 libs/std_msgs-0.5.11.jar                      | Bin 0 -> 15011 bytes
 .../balloonMarking/BalloonExecution.jadd      |  56 +++--
 .../de/tudresden/inf/st/pnml/engine/Main.java |   2 +-
 .../engine/execution/TransitionCallback.java  |   8 +
 .../pnml/engine/ros/DiNeRosDefaultNode.java   |  10 +
 .../inf/st/pnml/engine/ros/DiNeRosNode.java   |  85 +++++++
 .../st/pnml/engine/ros/DiNeRosSubscriber.java |  10 +
 .../pnml/engine/ros/RosCommunicationUtil.java |  54 +++++
 .../engine/transform/ServiceTransformer.java  |   4 +
 .../engine/transform/TopicTransformer.java    | 221 ++++++++++++++++++
 .../elements/InputSignalTransition.pnml       |  29 +++
 .../resources/elements/OutputSignalPlace.pnml |  30 +++
 14 files changed, 520 insertions(+), 25 deletions(-)
 create mode 100644 libs/rosgraph_msgs-1.10.12.jar
 create mode 100644 libs/std_msgs-0.5.11.jar
 create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java
 create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
 create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java
 create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java
 create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java
 create mode 100644 src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java
 create mode 100644 src/main/resources/elements/InputSignalTransition.pnml
 create mode 100644 src/main/resources/elements/OutputSignalPlace.pnml

diff --git a/build.gradle b/build.gradle
index f794746..70547ab 100644
--- a/build.gradle
+++ b/build.gradle
@@ -27,6 +27,14 @@ repositories {
         name 'gitlab-maven'
         url 'https://git-st.inf.tu-dresden.de/api/v4/groups/jastadd/-/packages/maven'
     }
+    maven {
+        name 'rosjava-maven'
+        url "https://git-st.inf.tu-dresden.de/api/v4/projects/1106/packages/maven"
+    }
+    maven {
+        name 'rosjava-msg-maven'
+        url 'https://git-st.inf.tu-dresden.de/api/v4/projects/1108/packages/maven'
+    }
 }
 
 configurations {
@@ -56,8 +64,7 @@ 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.thaiopensourc' +
-            'e', name: 'jing', version: '20091111'
+    implementation group: 'com.thaiopensource', 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'
@@ -71,8 +78,31 @@ dependencies {
     jastadd2 "org.jastadd:jastadd:2.3.4"
     relast group: 'org.jastadd', name: 'relast', version: "${relast_version}"
     ecore files("libs/ecore2relast-0.1.jar")
- //   relast files("libs/relast.jar")
 
+    // ros java
+    compile 'org.ros.rosjava_core:rosjava:0.3.9'
+
+    // ros java subpackages
+    implementation 'org.ros.rosjava_core:apache_xmlrpc_server:0.3.8'
+    implementation 'org.ros.rosjava_core:apache_xmlrpc_common:0.3.8'
+    implementation 'org.ros.rosjava_core:apache_xmlrpc_client:0.3.8'
+    implementation 'org.ros.rosjava_core:rosjava_helpers:0.3.8'
+    implementation 'org.ros.rosjava_bootstrap:message_generation:0.3.3'
+
+    // ros java dependencies
+    implementation("com.google.guava:guava:31.0.1-jre")
+    implementation group: 'org.jboss.netty', name: 'netty', version: '3.2.10.Final'
+    implementation group: 'commons-codec', name: 'commons-codec', version: '1.15'
+    implementation group: 'commons-pool', name: 'commons-pool', version: '1.6'
+    implementation group: 'commons-httpclient', name: 'commons-httpclient', version: '3.1'
+    implementation group: 'org.apache.ws.commons.util', name: 'ws-commons-util', version: '1.0.2'
+    implementation group: 'dnsjava', name: 'dnsjava', version: '2.1.1'
+
+    // ros java messages
+    compile fileTree(include: ['std_msgs-0.5.11.jar'], dir: './libs')
+    compile fileTree(include: ['rosgraph_msgs-1.10.12.jar'], dir: './libs')
+
+    // testing
     testImplementation('org.junit.jupiter:junit-jupiter:5.8.2')
 
 }
diff --git a/libs/rosgraph_msgs-1.10.12.jar b/libs/rosgraph_msgs-1.10.12.jar
new file mode 100644
index 0000000000000000000000000000000000000000..ea7ed16a55770077b4d494727875d40ca725e33b
GIT binary patch
literal 1938
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
I!5Yj10Oo%BssI20

literal 0
HcmV?d00001

diff --git a/libs/std_msgs-0.5.11.jar b/libs/std_msgs-0.5.11.jar
new file mode 100644
index 0000000000000000000000000000000000000000..f4bda8eda378e01d97a29456929286d14e04f73e
GIT binary patch
literal 15011
zcmWIWW@h1HVBp|j*ce&n$H2hAzyu-~7#KJi7#MtALmYKI{oM4K8Bi6b?J`*G&d9)^
z#l*lMf~?Tj(a+P(H8@1i*R6J<um2$jfwuR)zvO4h`OLm>GH>Am)ffdClSOX5;`}Mz
z%g-j=J~~%-V*Ps|FW!q4Hx8fK^ZBFQZlPYC2|i!iW-ZAI>Sr#V`}DeBrm$`2*>(-X
zuP2_op5-;`o&Tnp=M@;w{mu0DczGs#S4-})js=d%d=s|1Hm-a8^5DirqK!E`uiQcc
zlqbsG65n;Bd~W6KC!%ip?N-54@7Q$QT4#6q&F!we5#>cqpM7iN^B<N(&$mDOQ#HQy
z+V5>Qrp>b1C7u$dHNEx7okt#%5^dxR=NY6OymM`O!oM$T>kanuD@yh_{TFIx{mjpK
zz4F-ku&f@jBz2=m&*BZUS4?TJ&`n8Ik9cx0^up7$a<Ma~jd;#wTlyTjz!aMy!uC0%
z&f?!|(+#HkAI5!Hadeqe{=zM$$~|v6VxNbu)cV@T&?dm#JmaIG_Yak{oJUscKJ%gm
zJScLIW2m?!B|f(}y%-~g>_u|Y>lqmsikKJ}<QNzj;0itSO3X}rOLIyx9gB(*EA^6d
z5{rv#gHC%f8;aOoyq0-<`?c#%oF$j@=CnRKHuXn?*Vfi91y`>*%aToeQzi-iF%_?C
z@V56j<Fi^>l*iMr=)I--PQ~~0*XJ{Q+wgMXqr|g^tsFO&mtMA0jmWgykS^x2Y|(<`
z<b{izn|>y*?MXcqXFT(RkQU44y^}9*K9>4;)x}*piOmaS3U8<ATWw^yy|wD{jk^2{
zCE*yAOI?dC()1T^`K&#A&hFsf?NR&HKFs;Zxw&US!0Phzu?K3{ySBco^!jLR)#+TP
zrlP*WWQy&L^J~j4H*uKN`^`Kdtn*ZL`#ZUc7kRFwGOQcT8Uv;s?>d=qqBl{HU(e0s
zL*UZflQSQNWc~G+x%At-%O{0iM7aO1QJAv9N!#ke#`vYRvTDxjbWSI&GuC`*Fm-cC
zURmw`e#xoHGF!Dw{cS{;1^ay2w!D{1JM+mkD&zaKXS$~^#mt-gMfdYxNv0-E^JRDU
zv@&(&**^YvO2lTn{@+{E12uNEAJ=(M!1q~FFTwDzs*d%v-@cONU%64^`2RLO^S2BP
z3_6UE%mt6SP|v&)3rK|d_8a;$ISRDimtn7NdeLcCHs!*OR^Coorjx2%Y6_iKQ(MnI
zJF#*4n|B`{>-=H-r}4PMFzU>npU*@;KYRT7t?U8abu2-R+>LSzXReQ%x2)yfVL#a^
zI#W%HBx4fK$}X&qkCdOnn;m-1%F*k^lgTf2W~Z;tG4wC+6mV<r<m$R0!E^k~zv+(;
zR_svQGClOISykASSr08YCzgD!?JjtB*zA7w<EMq*9{-JW;>xRpIsTrKe5s|+Exl#)
zswvfP_Zmgn{nKz?byNE5_L?nsl?0U5v3<`zlJV)zqxH%h&z{K7SLm`7uwr<vxogi;
zANTiv(1K^0m;32BMg|6VCI$v2<dls_)GnF1sd>ej`FW7Q$_+g0$7ComhiMachf-7h
z#|uYJ7ZnOyRv9&&RBKR^5cXf<ba#qQ?B=(#UReKdlB;2mKXpTwL#-eqec8;P`|93)
zKmT03!OTxa#=@ecz-5E!uKGQ%g|1Wwe>?T3<KzYTS1u<$Oj=MS>%Da56@DGBo!!h$
zr&e6v%gJ`Iw!pfe(C0y0%=a6@{Txzp*}<aWy0X6ccP~^a6!=VBSn-^ta=oa;+J7Yn
zxs9APjV1mck(qj>YkGU(te&5}9X%GWmQNH5_dImZD(To#p^Y}@e+kafvXwj=vf>Y~
zT+^*rVcY$K?XIzy_&M2kPSs!XtTSbz{bR3<6Mp}-6spm%X6)VcP-AI2x0wCqfIUT?
z>h-dxR<69XZ^5ZEE^9AuDpmg4vgFs>*2^JWYokstn0uY=d5&$Aio%JRQ_X)Ha@{c6
zlVNAWemvv*e7%Jc2Knt=2?f%j-PSj@MjW1Z^q157^jj&?X1D*aq9$JVPYYA$Gcqvj
zLN9l~i5C$?keKNW^34}E6p)?1Wp<8cuA+lwgU-`QF|U}Xd(H8(U*hqy{Ynt0qKL2A
z=4kfgZrj8)>wB5)8<g!i40n4*hN!eWz5D#;%<pO6PTsGt`^(0#K2g6hkI7%SLM@@T
z=I_5xE(ac8<k`Q#D1*CHbnmvK(u~pW=h`~V?k&(<$s5Z!`|;z+mmmK8P*qWQukAUL
z73)z!y%<T>J#YBk6#b5W4qzz_o3(;}@A0EXXRGF3xU%on|HUN*$_j}OlY2B4oZoa#
zJj<+5QN!C%@5+)h#h+fi5L>JId0XEOXQ6i<&Hw%vt_piORlC-0`K<{J?{+WjWk2ij
zd#WMRw>tl7ef@;x8{Z`vE$;d67q)jVx7Tftdy4{#xfr>F(!E7KELPX&O;pI7^IOI6
zRE77aeWFE2CkLO}dNt5myZHI#d2@EHnKQXJqW*F3u@jZ9$GhadUH+nPm>ISs##YiU
zcv<n>wJt@Lsh`6_Gfy6tulb=dJ2XAjdA;@Bi<e5A8yZaO<Uagn-I6f(ymZa;YYGo{
z{B^(67}nj}?#pnjeM9JD<s0h?*~@lz<)_B}ej<(<wL;eK_+BwEFleKfOP+Zp#zv3`
z_3iidXEGFMyB{gGtLsHq+@8XgZr>*_0u?fq5||V}ZdrN3#CuxaC9(QB>~#(Hrz{eB
z<eojAdD2>be!M(8gYzA(CrsCwVx2Ze?AzDFdH4C+y6c-Rojc|FW$EVrmUF>xov!Gu
zE7@u;S>&`^qE|g@*|aRX(*@1~*N#l=n|0v@zew?qr(4#uX&?Hz=-%(GGp9^V4AA3~
zf7id8W4dBqSL_DId8=Cfyl?w?``Q}ih2hoOwX!KM7k%^#FG_d1aP7oP|0gq_2Hw5>
z;gVS6gbk)Q?kl=Z{w!uc*TEqD{|_F|Q&C$O`@~-qO!c?=x^5pMYS^qZ5nTx?vjZ6!
z7(|f^rQnjH%)E3+;N%9J_G5AsSQFP6S$U$X;=?gPy>kZ_yEmo?%c%(n`Og+qo2+^|
z$H@3cq1+D!`%^cX+=OkvY+kk6`tP@YRSX5~>l~B{G%qNIY<_zAamR(3Iaj+UwQh3L
zYdXDlr}`E-uh-3+5|?)E?VBhdb+f?4Fa4#_-1A8>f-M&lS2QV={BHj5((+#|=KKFg
z&7uqUX?)LHd%SXC<w4FJe^Z2R+2w4SYyPj>-=j|D+4<<bd@XS=drFp0-^qI`GW5jU
zZ*h{k%a?m({CZrGf4KchHjC4dvSa_)L_;jsf6P|mSob*otK}jt`3|-N8#~3yImO-A
z{6!0&;%RX^J~1#b1T!))2qTA2NM>#-EObEaMUgq-jk*d^7n|=`96D-S@kL{TiKD?n
z#gA9kY`8gP%k3q*e>}GN!2Boh7(2_C2M=q{`>4Ht{kxd`fnYh)!~?w!(*yh`Z@+H1
z(E9EQe%0dC-k2X+o1b-FsMK5g`P8qar?y+UxMVC}{844zQBRxstvggX7XS6AbloA(
zvph95CDbZ1<N1_}Mkl$>Ivtwpu=n8q84o92h?;UcYpHtVI?l6ye<kL3)mrTL<4(WB
z=-pAb_uPH+s;8WPCugPYUAN}c`A_=CPkowq@~`Rb3{#GlhR03C{H9lS=6@(=;+S{X
zzF63?cV`B3jQ+)kx({C!?EZ%qL_hb-@V;YUV9-ZTLZFh<&<qktzW&fa;)?z`p$VM5
zq>~>VUF>j)<=_&JM=K)}H*0F%Ub6e^@yZYEKNk1!cV0aFdq(BVGkeaj|IW{_eTPT~
zD;txulX3KZo3k8;kH+oQjMT_ZdA0h^tZJwC3%8uper>*LMQO{73n!OtuH58v?PQkZ
z!zP8EZ^2JR7aGo6(sNgz@A%6U=Zxj4vAJJu^i59B7k-`pZe4#`%f8RM-#qA<tUgQN
z|I&!P@4j9Wb_0j$%;@#ntGOyKoYP$V^l_%puF|?G{bg@%=LvE!hByBfbuy{U|M-}Z
z<?#!7J7<9+hZ2T)v0rAW&iQ}m*L~DH*7kFya5EzVLm3kTg936Ia?8n2EHO4huUu+_
zV!f52joQ+`F|p!hoL`pK7ADkw@x0RL^q0XkqHD_T%V#8fC#Oyl{F80>gSqAld*@4^
z-J-0{lP2GpQ#?uf-R0AVl^bGf_%{eXh;Hz0`}N?_`I~}=qu#f@(+FC!`Nf^5LFv^z
z-t2DC?zdtmX}K^<^K>^KUc96F(%u*I=9z3bdf`mV>x+9eWe%S&Tb_Qmz+ltN-ahW9
zPwM7ft}T7@cUIZ4zgPdY+}fGKvFD?rWzveR)_-rXzcC5O|Nhue)yCX)UPpx1!3~ny
z&UxRzpUFv|BXqd`|M!{%gEeO^+5N3n7W!|L_etkeZ|{;arRz%;P24ceNKiKX#D_bN
z(!C~##z+>QK3Q0<`{TFC50~TZN>ih(GEMw_<+lB}pmNkB!#(v(c~DpXu_CF{Z~Y|d
z3?64Sg=QE2_E#~Qdh&?MQ|JGd!eKMQR(@N*?9Zzy=bt?F4UUx1GcY*w)A0TC+$#a!
zU$e&R7jyjC_c86h%i3r5^4$%`^&_-CYEScyIk+nQXP4H_*XvOuaM`z#<)A_mqhafr
zR{~Gq{l4CZ9R%9$dtT1VS$pi&(dhoSM_pO;<$g0V=C)30TE1c1=}D9F63Soqzdk7c
zpkHXY=*IS+6=@Rp%J=R2KA%CZKzRaJ4Cfb)vq>MnSt)**Xa36hq*tW!=LcTd^EmDX
z=GF$7>4a{*%o*ggT*80ZO`YhJ&yh{pO$Jsyp#d$&5@s0xw(n#AS>T!R{Oh^3U$(3<
zaZWq@_wilF?t+JhcipIZ{It-^<G<~h`{q@m9Di>~zRc411~qIaMS~i)`~HM&3z1v*
zJ6kMwJ4Z{$;)6fM3}@Zh{^K=AlcnWDV;4hdC-w(beR}>kFBg{oWJV31OM5@+*W&21
zVN2bZT{f8uOSL~TGOraCaqOC6;d?w|)(I8mAK7|;7^c@vm@#u(Ux<N<<;lIz=R9ev
zsoA@i+2Y8y_F3(`{Igk}-uwFYspP?^*Aw?{a4-^O4>uFkvQvt%xp*pK*&E);n(G(1
z8QizFwdU79^m;>a;6X7*(`Va`#+7DqmPwzTw(;-13rEy4mS5_6tdh8X@s`i4XEp7<
z{-gcY9>ouHK5B06S#Twz%vs!Evct}cyvAMiOE0TDdhS%z6t&{bL&wCe^F>`Y{4G8e
zGB07N#?IpZCzQ*zS53C?*uvSe$tKW;%{h;!yYhmZ;=%N}abD+mmIu97Kc%yke~#aD
zhvQbao-;3O5skXo==aC!?Q0F$qSQ#a;<=ul?K9`37Hxk2yZ+1yna3-xuB?1EQKBOw
z$7n(AcZ1|<`kS0~mv70aoF?|^&yvnF-=A}Eq}`cO`kBv5WB1oNzqO4&+}ZajJKlBW
z6FIrh4To8Ep6zIPDiglpRm3~<r+2>Qqek50#go^y;VhW2^|p};rtNj_*xv}f@c#YC
zMq}R(m1|B5>l&1FQZ>t$&os;f#ow3pKOgXaxG1l(%y?~V*o_HKRLnsU`1{MJ4;%^n
z@k}|aH~2Oj4v>xeyT>B&#*6!xY+bubq+)mZy!tXB@$HR_*B-mGgLbY+>`pAbVfpgg
zxvKEJpEpa{8D9y0_{+p_XY!AGS>M-6^By<bdNFg|9Gg={v!)!sw?0q&j{MsH0k^O7
zG@8GgpxoxQ+V;hdhPmvk);gwpaq9cdJGw}FYQl||TF&nh>JztF`*uFOecSfE1W&K)
zt>^pmUEjnX^PT24bK}G-ekrp;OvJ7QX)U@eBsp*PA1BUDP1?!-3X1OB<@lE`RkQ4|
z@<b2axhAvJ)wpNZq&%w8*|J#anYHH8<H44`Ps_}C?$0bVJ-o?u=U(BBJ}EZFo<C01
zpX(7-OI_6*UtCvtO8nEKWjl3v!X+f8{fYSYIXoob>ub??eQ%CG`@UV@*XMP#-Y$%>
zUw%W_1NR!O4UMJeKZ%AGn8%~lzHa<V`*4ky7@A>LEs)H&a_!~5Yw1^a1u)&+BF!#%
zXNQn{zzY5qB1=3vFPHQz>+~^d+W+hjf5A)k&Y78|E(a$(QTaZvc#`y|Zy!H#CGeN>
zoAPJNUE}m>Uj6#CaMRRtw$(|EDOy~+%*3>;6jsP(rs@Q5JDzgr^a{Z<ynX(Dx1YaV
z{q1O_q%_Oaj@x|I*E&^iWNouL#>bv4JoACh#4wp-hSl?y%#A<#<j&h?_E*CC4-_9e
ze#WRNY4g?hyBdCSO_}vK&+FrEt4`-SEfw_@Tc_T=dwy-%r6!J7_m}@U1sX4jzjN>N
zg}Ys^EVz<#nHK8wi%vc`L;A3i+#KHt5B56htERUFul&lKI_;LVU;T84<yKZtl)>3=
zV&7jj*;fXV#i@~EpzL>i<(#EOn;(O+-<(HFOjlGsSt!w2kY%*U`MW{zH2q6Xzs*hZ
zBd0z4^k#|v%=hPo1Vrx4DEzF}rLpttn%~;26?yUhHm+X~QNrJEdElYVDoK>_5@FQr
zH~Griee)O@7<Mo*Fvude3qZpq=rPwD<eM#RC?LDk@7g_;+*?aLt33pNB*ias)^D75
ztES=L&xRHU&4WGHH%sr_6rz%Quzqd(zXrL_%}(jp{pP9#Xl?mzV*UBv8M`m9-yQd7
zsNl~Ry5aSpl<79pH1_H9&-b(JdDZ{XTB~_mfcVAi=o*0ybq{hnG9HW0nlx*JYC>s2
zMadoOx3S;O`OV&-ydX5-&EqRm0}tdazs+B0GNVOl#pFvae=k<gId^Hzb*}DP<#X$&
zl&xn`(W&VWWG#uf_S31iU5_PI^VmwMX_bC)vUe72O|iQwSnhGicIEA#_I_8j_7*HX
z{~|(KXv59Th4qFP<DPam%(XxKZ?4#ejRx;>ESB~B_YIr77uw?#2K6}AjYSG>PkY{G
zFu~+p?No`>J&HeXa9BP+Dfsl(s}*yn?);n?-4_$)cfxJW{*P|SPnIl7cIB_m{N>^^
z%ko@UbX)$Emoe$Z6Jz>r?5YeswfTMh&T0H%bEk4w-F-Q4+A?h>7M+iud+z5iWISCH
z_fUE}3+M5(?1kJ?yxU~M7$vSJ>^=7U!=hun6(>V$)L-8^i`L-VbofIXsJ&pw$iN_m
z9I@aApP31AlUSfOm@Arf%Odf7nTL<$OyX>!W|;&UG)}0<3X3pTO`ZKl@1F(#KZg1#
zg(AIj&mQkRd8YdFzmLDz9tfo~tvt|qpy7g^ct5}Jp$B=3<EE^cYFZ>0lX{kSVg2n0
z`6;~Kq3=tYrd-h7>>20N?P@q%%|ex9vGcMfr7docdp7<*`cXq#pR@gQ+Ve20^;y0z
zo|Y~?^!4h|=~9Yc6JzuCe*Dy){_6bkH<^pW8x3;iOkDSI(<Vpj)mb~Q-qT+E^zXh;
zcc1_LS8(={ER*7+j6ys29<%SVb+%0jbN(D=??~F#p?6?wyWQrN#qV!^R7Xwu8b5N=
z-Y_sQ=wa(Jz`Nw&E(17xT$ez?N3H0K#)O=v1g1$9Sz$MFyiS?D%==p?2OcO?Fszu-
zZ$8=l{n_i^kE=Hb=CK4dYJ&y}*T&6PZ@HJV{Qg#*Et`uZSKYbE?(}?PiCu>HwOuQG
zo2FbicWm;?S*xc;oe_=^ZZS<<)2wE~=6v+V|A!R|+OiM*+_YwO@62bdiNCsw5=-jK
z1(Zu_Z=_Y{@3raUe0lQdqug|}#tZt|+N&>}zQY=98GB;y$GB+a`F&H@U;Ej3@BXH|
zZifyFsX6(Ai%-^e|L;?fQ2+lya?y;x3waCnI<zluIekC&J3DIdto*xE^%nyJLpmb^
zgE(^faVafIEP)RXmQFbDcgR8D*#4CV!US|*9CZ=yE7-{1FQ=>GE8wG`GH=$@JTq_#
zvXfz#KhSQ}SKk$9bLQN+Gu!X~*_8kOcR0iL9ReLJRZO)`#?f}ReVl(^y6ro$V~X2x
z?tJdW?>X-NK4qcb8-KEBxsywa-?Sd}mpZY_K1X&GH(fZTe#!gL)dG{XYx;7ZK3ZGk
zmnEuhtz8=^X(qf*ERO&G_1>_SZ;Ni-+&W8SX;NEN$!AWF7nbwWqnF=($gB7(b-sQ6
zm0QAWU)v5<r1t9Yua?_q{LtjTp~RD(tDx@Hal!f1GZviuE><7GaIo~payz#R2|gtZ
z=hR;mP5-+uEnOZpxW4a6JPI1$(LnE`JLTu+!19_cXxO>7Smur5BK2E00-YX<O)KM4
znXWOz!DGozoeei-EXyX}Ju096kpF|bBzy10B)fY)&-R+j&(D9)kXNWWfjfrd3&+`_
zkDqMRzQ~oo3OyMWsr>w6__aHNyZFzwt;mU4^=pCglNLWqDgUm_jT&i}d8V@@mdLDJ
z!O?rL;Hbr)M<pAi^f=Xv%RflluFUeyxNjYPUuNkH+atL<`PEK5o-pCR<&3rERl=OL
z&wIb<ojB$8cI~RCaqSCwruo}XmAqba=l-UoZU+wwsX6N>E;?D;ZSSWbk^a9x+Vj-8
z3yeGFEjk^1=;rr#=wr^kUJZ{M7#SE!m>3x3ky8?=Z;roh9$xzzJe^{dFn!$-cAhI*
zKNvKF9+}7nUv^QGJQ!d6kbTFO<|AjeM6FElD4I08*stht?f;ru<_kx*wU_cs%b9U@
z-CcdVTe#`!wFcYGptkvRP}^J~!sZgRZLXg<H(_6OO_9{L!>d2+i9ICdXbEbYmt=94
zWq+NvaqqheN7O95mx{J~9*T22er|n^+MT_(?63UdZG7I-KQoo3HEOT$u7;m{BH42d
z7XO%T<*Nj09o*Q#H#PU2{~oDGHx_IA>psF9T9cQYf6s1H^nQ_5XS2&}2aVIhM^g-*
z9NRF1JzZJl$BIkbi0PEZ%P&=4M7US)(FaYZ+`8TwztmQCDQG$+89bdbd9zQR)V}}6
zdrlelMNOThF4wuQ<Ct3Qt>Sp&w4W<a7`?r7asIUVmpX0szl?tNyO@Q=IPc7^N_JL}
zyH)2xPxHX%Q`R51c~HREZK;=Nd7LXu=JeIzbFsgfP}BA2@KzpCMh1qZj0_AC$dTuq
zpOaq{<nH7MP23j_`Y{=buwICkm?6j_D0)=X`^F8HY3n3XI69jcogQ_Gtl>?Wp_cpc
zam)|Kx+xnk2*z%CKhLbP@-4We<jbqQQWNughvEs{H2w3nO|Kre?KPI#>~djc;A@vV
z!c(e@F1D$roqHt9AE2zEC->`Ofyo@+<BJ(enfwck6;GH&Pi(b2knOg1=WeMThZ}=m
zh**`*&C&FE>bJIHOP{6VPW9xKYRwy}x6eO$ZrRz_Nvm6z9hYu8b$`#}r)}$b9G$fs
zr(P+UE3r;U?6U6lS)6|JV^lNt9i24OZ}&p3{hl(HKh20x^mmxBQ9Jv)mCci!bGP50
zKCqqd-%pmt^!W`+39mK1+N1nxr|p{b%cj)y>(P7Lu0LIP{VG3dP{y5&xP6F$f#CxK
z+SHV5Zb1ojF44DtH`gHt0oV6GylT4V&W(Q{Hf@@e;sb7xgIa5L=}b&f-YtDFe)9+B
zKN^Ksow|1xpBE`kmpgx3_JDvaKQF&8zpj(ztv6we3$3j`a;I~KPg=XSZ>o&otj9i*
zr>EZiq#|x7)ly}`x$L3RotD$B{bmcdohzypxNITF*YqW4ee-uMr_(o*r$}YqNcVd2
zM`_yc$rce#_LnEUJhLGpa-pbygjUbPpbbB_3kN6)aINd|tJYZfrsimEP{Z>Z{~xak
zE<bwwdOWJ1x$b|p%mvM6u%Hd?dZZ?%q!vNaPH(WU{~ZGX+0PquoHeI7ap&?+`{p3V
zxlMQb+l>y=olHX7OXh{$OY!KDsopqu>F?`RFZf^dud?#{vFg;qpfdI3{om8>-T3+S
z_i=xQ8_nCfH*92>&HZ84!9N8b-hOE~`0C=)86ES4tlrP9)Gqxu@!%!(#dF1P&F2nH
zls1#l;rq_dH~DeOggG+XAM!Sb_5I^nFLCDB-Ik#8$>)xGexKuLol_myCz*5Pu5$9{
zd8X^a7ZocVzvnQ`qxIH1zO9n>d|XL_ow8AZNs|mCly|yU_1$4UQ}suGiI|n~RNs#Q
zS}NZ00Vx^f%##jo`h0Uk$<EiNr+LEOsrtE1pHap3XPfIv+bG>DvFqb!pGdPSx3Ii4
zbAzP*#crR9gZe#BThDNBvF1`=v4eY=;p4CC=J#EE>n3ZbvE=cWCo3*;EnT*!h~-n;
z@?|>Oy1@@8R!g0ZuSxPc%PP<PIyFi&kuyI>t+XM&Wg$yxl}uddir^<F>*gEWN{p)X
z<n{Gb+^Qkt+htZ6GV$<U{zidPw(Du?66Y@76Mw!>z|N%m{_$yNf{hP-U3si5IdA%w
z-$#~f&3s(A*KEm^QcKZ=Vg)&unvP%j`SOam+hm1Log0FBMA#lqQFB-o-MHmy?SeJg
znYvqcPR$p2pZ%wQ&A!XL^UAoaj79J4)>_UeRFHGlC5=VaH+y1;=aqTdmYWXwEk2Ot
z<u>=%Bf*Y{ublxR=VpdnVodoH^{eUBp2hQgi)E(leg8RT=EMMV?REQ>`Wj7%ypnVv
zp{;K7m;Ic@2LA7LfAys|>`TnBKQZ4SyYHQu4pTr4mv?Cm+v(Dn#^<Fmt>UFI&810(
z6_Lg9=tJvv)7$)B<CvC#w~_mI`!P9+wEf?#b4F{C_6<<QEg~iD-I&6;oy93>t7M{4
z<fb!f#?Acc51D@i9AiF~QK)y{^5^-dpI`rFK41%K1ZFpyEu6PLPR!Y<dQ)(|*R)eo
zJ9*Y^c-DELYTX+CQ*B$d_^lkhGM+U*)R>*RI>*lYf+EM_!w#&jE580pPWyklF#k@x
z@VV(%59WSZp<(KrcKGq(yM^KpFSY0H`+n?n@YD(a?i$qJed()EqMg2E^&Xv^3+Gk^
zz1#ZzREFi>PMggZt9D1n-BJ)x+9vfo`pAmndk>aFCW{rjBD>WNd}PvH_sMhly{qP^
znU_0Uk`ZUcjk{luybeOfrQosG8mEP8okAxlsrp?uoTX-TlH=bjZu<jE<yF#_U7g0&
zrlP*n^0|uno&NRP%Ng2ld<*!r;bG!rh5LJV?X^*k$hO%e4qgY5o4jyQa?{aZ&^m~F
z1~We}d9i%Hd+TQ9-q8K4;<s?!P||R_V|HV;pU%O&rMC>WU6-A4g5|7BRH4xEH>DMC
z{&c0Cxx4z0^V)j?73X#w(@{PVx@zt=?iuqP_Fc+cF0y~^WQ!-DQMKOJyEd`AC$Il&
zqTDq1e)cj>7VXDN^xw%>zPN|75aIx6A;c_al^;5ny&*NX%gm+Uz%{oAqUPQhzsy!v
zjTyEOLIJc8;v0A&gtE*wBh&LXBDI2jKEJj+-<Njelkmi}TRRsE>stSxnr{C0L`{8P
zL&CA%Nb~m!?R%on@64Ln`21UIXRYAQIlrsUF!PCTnDJ0(nsLm*RmnT6PVIP&*8f}l
zVEQUh_eK+=L0VY?oiy_Ghc`$W5e-uH2{DTjm=rhe0yjv%O}cyZ$bL6?i}cyq>dEHv
z^7D_EGnDTT^I+9u{ne7Tv8HmKz^{Jmud7m)u9?{Vz$^P5=ic^PzZT>~tbDaVcu7m1
z;XI$uk^9a(-^>!ul2{_KdI3l8LyhEj^_4bf+_at21Lg0y`JeU@zI8MD!uI8%Hh0@|
zH-0~Mda{Sdf4v#&LCYYTkw%Ll%OL(L^v7?m-0-w_u2`c$p^3$P1-Hqs#rDfM8u<VF
zXtrp^-WN<g=`S{VS^R$&TZ1-WwT@Z8WDd4b52wnKR4k(&{-9Bh%LmlFGcy~R+QX(5
zdFuVRknI1|yGz7QML@_&V^&U@IQ#K+Ir&TfY?b@PT=j;3mDO%e-Yr3`Tkk#pc&0kp
z{^#-a`S%$gD8EtJF!Mkd(|Z;je!caeF^{+XAGP6Q9zq++5Mv&isAC?w@G+0ye%s|A
zWf*X}2B<IX{I&VJ#oVQl>qW)3%3J-{d>hB<5%EJnnd`-dHJ@9h_+vRv1@#1*>U^HF
z$7+Xj_Q^NbL1P}wD{oiIEzg=7x8qWJ$r@hH8#m^=Ma{`r|H<{hxA}+de7PgyCCbfY
zf{&F?4o!dGbjfVe_KYhnP6wK<oaABslXJS*S;9l=`8!oN$@d=ra$Dwne$r8tTYBZ(
zsXITn=(_7^tEVVmtNydluqf!_#zpOWP5!!r#ys4j+w_sgJglBn-@9|leet<dtb5;m
zaqzw@%E&aWV&8-RdL{`ouWSE#G)>{*j-MKNj*Aa&JFLa<*gInNN6|g&3T5vVi0(hR
ztL!mafu($0ca;D$1H&>_w4MecN_`S5^Gi!0?T*%v*LgyYBJ;Lx70=qc<=(1#zf<xn
zL^Mp?)|x8bQd8Mtx^Sf-uj1vqhmA_g+s>Tn`l?zZU;l%_Zpz0qPK|LwoExm4&-r=o
zdu?^uzdwJ!&Nd87)qj3-bLF?1d21`*<o*8f`nhfYT9c|j()zA3ZA+J3b!xMgi~hG_
z$;Oyl!g8uR4$P~}S@}0Je}7$s{W^JBy$#}Wv$-$U2^lIr`Q+Slq-(_$fn!34l7d?%
z-F8`gT+5v6o_P=Nt&N<%FBLl1tjIj8&%v`)(Cb}|LW8AoQ~cRj_w(~B)>PU4iuc%_
zeY5b{H2G31miHTH#_aP8EH<^8y?XZ}pJ3Hn$7=;Awy6tWVA~(isk`f&T=edxuQwb>
z=2t%_H}~s><pLVA)3z9?D(YsPTpZMM?1O+e`{C8*pN+YX$F|%!Sjf)K_)GA5MuT&Q
z(AE#_H_tu@lIu^1SY>s<IPyhtZtMIDdK?}SH@fY_7>|_+OmTZ8wBQ(nRn$?3o<Qd{
zJxl+FHBKnnqL*g0-J<FiQx<>ZidZwb&5irQYE{@Wj5s;hh6Rb`PW{EbxIbBv#U#H$
z@RFbRk~NQ&a=YBDja-&K`~9Tn5}QxBY9PbbW7BV4SDT~Avt@&rY9Q+)x!J2#czBB&
zS`MT#EbHI*f<tKbt2-sTmStHxS<j7J@czh;IT~NMo>$)RJvqlOyW*+Y_I6#r?NQQ?
zvX)%B^&;@eo~b9TI3L_w+VFY-!&Tq?r%&GEh|8b8KYzbwbH~e#haGO{EpZl9{O@K{
zE2_!6ILTR~ImGtlyo`s>VsABA&7T&1v}3-Y-o@DWi#T?d)lM>c#NOl`czk8XscDO@
z@+NJ5c;n5X+o!I*E|OGGpL#U#=?NbJwkl4`>4zrX*8Kj5qab_MK?jy?yX{W)a0V=1
z`9hSb<Ze~;PM`2)58dq6_!lJ~comYvGyPW4XV0uR3cf<U+n0u)iClMe0fX%>#r=~b
z#4cr8mcLFso|JYjS#G!Ue#u|)$(!Hk-93M?va0=}<0-La*Sd4crk&&6<}$H5GiBzr
z?>C!2{!&~kzfttqi(RMWf_wU=nSB0&Hlo3CLwYf&0>M6jh&e#EmMQ9Dw|QRyXmOax
zEE7lg_~GfiOR;~T17sXhwr7r4PoDW5vXYJ?oO2V4IA>K$+RmD)IRaIe*Varu<gxmw
z(v_)K%Uj;<-E8L}9d_wWXjjh#z2lSj%n&`DWanMz>9K_?SyE-8p~SPEzxtpFM^}s3
z9kqMIDpN%kPL@_b{NmfQ=-vrGH)xi}RewBe{PlVAzdfO^9bW8?>b_MOcymFPcJB?%
z_e;YbJ&gGI?sVb){fRFjbx6Fj+vMM3`{fi9=lnaY4jMl+JFvA`Z*$A$!*9@sHQwB^
zk!!>?tbuLb3Nq^fY8}CbHDIemSF_3^trGnOpL5&?p7emsSbhBZjW2<Jwp^I)n#u_E
z6WiCnpS7Ij^jGz7r<hKLh{W8CSn*;)!oLXZ<e8hc`>5?{2yMFg?c~eIw~NYRckj_i
zXkH*u7@b}_H=^mS*Veq8<#&xIa!Pe>d8E-7SziEZ9UZ#664W{psyO$fCDLue>X7K?
zdI@fgHA_q91^v;UdqmM*c#`m%yH}>z-k4wUcA2DLPVf4kz6u(?llIkAJX%;Sezj2K
z$SoG9NI7k_W;ydVSDOr;2@f{=%${U?c;%H}GmX68DlgwZd4aR++Yjpk4sor`2tQso
zv#eysmmQmQx_6#ivSe?_xuBglzy7sP3*jrgaO%pQ4*?~v7A7w*_5Gfuc-r4(R_5z@
zebHrJ>Yv^$n|S7XItRzHJ2T2Yixr*N{k3QHG|h^<_#Yefm8KWR_eUOhDD%uX=0H-L
zs*dHf)ysQ!e?nUetn|zE52)df(L4gpdqAoOU;mAu6-S`)Iz}bvc%7L_83$y*ZjGLH
zj+uMk-jwo>k2U@<*q<`U=n*r{2MyTGJiq=idqeddjwMXtOtwz8@q73AaPD0`w<>&7
z$h8xx1+Aw1E$5O`YXi*IgjQbQ405ub?~{JhCOWmd5<Hpi6B5vJE5RZS)I5^lzut0f
zlhuyid7?|zOpK-7%G0&Oz9-IpzxU&(J1R@+#dYqLVO=HqU*YuUj4SsyC9if=aFH=R
zx4k3q`L2Wd?gD2f*YD}ncow^b@fdf>4(}a*=9T)Rw)-`>81q4kX|Rrr!+S-D#-k=I
zbU>Y=Cml_k9!aH<iJL8p-l*=b{%65m4_d6|(IfWxW7?-@dw>3^`p;0%%iS3Az-NJb
z#<SDYmm4npz9AISE8<wU;aT5>o$EopqN!Tha}`v#e7;yQ>FlOdv-zqP>Kuy?d$77@
z@U#UV`zL<9`DKBtMO?_%=+~ZsS<CFx&F<Wbd3%&2R^IIAIca_VWT#)xlm6|x`r6?|
z_&Ja8%E%iF=7ui4llgw?#ZMmterCnKdHI+3^)|>_10h4uT7&l-O@*KM<rTYb%HLwR
zE?iRKW%2iB>3+24;~r73*H{O8oih@lV;a8x(B*1kX@VC;_f|aS5P$yQqV)O{VHRPI
z&gEx!_#A^RR|6%U8yP%uzXI>RT=fdP)ad&TK@Zk-ELAOO`|9du2~~ZbTNS)1=-P?U
zf~BVXE$?=0v(u0^TV?fvMRVa~|7DwVCa&H5ROz6pqlB!QmWETZfsEm|dJDOpHt9n*
zSJ~}wI)BPb_}1g_r|<fL&b))JF!u29=bNT)9n0dhzszmdt<#s--mY2oB(8dW&$Ryi
zQzg0W-sMMbbX9PX;XSv#<KmNjN9ElGdM4NJ=+#I|f58xQ{^C>3hmX?BfAR)+Gct)V
z<K71WT6NFBAi(g}5yXP;ia^(fzAFNx7=)KJYBC^gra;;wfo=jwHS+R)5FcdmU&lp^
z42U)S=-SX1`$M!bFl=c&jjYWR+tPn@v(Q(cBg|@JMsfmZ;2XLY9o+=<1=<J`ma-t3
zfN0R7E!Rdj4}D27!aQd-B=f*7LKq4u0MX4tU&D$pOO6A{EKkIWR&*24S9&5$u;N5A
z0eRggx)JD$ArVGIaUmIjSQ?3L0QyovgaNhONCtpH1h%dU-3au>bO<Bn@gNxio@vFL
z;6OJGePtKIw0J%w(~#DAp__od_z7V`9Y3lGgk6Ka9tUBTxge5RV83Cua?o9dzA^-1
z+HWBw)4+Zsl>E?_Dj>|-CW2~~1tFu*C&v*+^@|}H1@$EM+<-oRj4)$^IFcElbOdWG
zqlXUq94o?z^Abo#pw76W8-hObh%n@zB$6SBc}R2v(C6n621rUH836GJp^!zNFG3i0
zO$Ny@wAmwcC!tT3AWTt|Lox+v;so6U^oa+A38L~yCU_uCL!cXhJ~oUnVyhyO5#Wje
zdlEq(Kt-5vNeRgWP{?8qr=mLteLxRkSicIAVW1H#?5;r{^g<Z0MitEfLa~fK(1I|k
zSslqJgfYm&F6bUZ?`R?nyP$<+7&tTH%1P**F@zZ(w2{mJg*4$p3%zfEFl?PJl3|FR
z0=kdT8_);?PU#^T0C5fW$U<*oB8+&gk7NX*!5QGq$_7%T%%IHB&dI>QW(eW|02QL}
Al>h($

literal 0
HcmV?d00001

diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
index 89db560..b081078 100644
--- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
+++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
@@ -2,36 +2,42 @@ aspect BalloonExecution {
 
     public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
 
-        if(enabledBalloonTransitions().isEmpty()) return Optional.empty();
+        if(!transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) return Optional.empty();
 
-        List<BalloonToken> inToken = new ArrayList<>();
+        // synchronize marking modification to prevent concurrent modifications
+        synchronized(this){
 
-        // take a token from each incoming place
-        for(Place place : transition.incomingPlaces()){
+            if(!this.isBalloonEnabled(transition)) return Optional.empty();
 
-            BalloonMarkedPlace bmp = this.resolveBalloonPlace(place);
+            List<BalloonToken> inToken=new ArrayList<>();
 
-            Random rand = new Random();
-            int randVal = rand.nextInt(bmp.getNumBalloonMarking());
-            BalloonToken bt = bmp.getBalloonMarking(randVal);
+            // take a token from each incoming place
+            for(Place place:transition.incomingPlaces()){
 
-            inToken.add(bt);
-            bmp.getBalloonMarking(randVal).removeSelf();
-        }
+                BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
+
+                Random rand=new Random();
+                int randVal=rand.nextInt(bmp.getNumBalloonMarking());
+                BalloonToken bt=bmp.getBalloonMarking(randVal);
 
-        BalloonTransition balloonTransition = callbackStorage.resolveBalloonTransition(transition);
+                inToken.add(bt);
+                bmp.getBalloonMarking(randVal).removeSelf();
+            }
 
-        BalloonToken result = de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken, balloonTransition.getBalloonCallbacks());
+            BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition);
 
-        // place a token in each outgoing place
-        for(Place place : transition.outgoingPlaces()){
-            BalloonMarkedPlace bmp = this.resolveBalloonPlace(place);
-            bmp.getBalloonMarkingList().add(result);
-        }
+            BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken,balloonTransition.getBalloonCallbacks());
 
-        if (requireFlush) {
-            // flush the entire marking tree
-            this.flushTreeCache();
+            // place a token in each outgoing place
+            for(Place place:transition.outgoingPlaces()){
+                BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
+                bmp.getBalloonMarkingList().add(result);
+            }
+
+            if(requireFlush){
+                // flush the entire marking tree
+                this.flushTreeCache();
+            }
         }
 
         return Optional.of(this);
@@ -45,6 +51,14 @@ aspect BalloonExecution {
         return null;
     }
 
+    public Optional<BalloonMarking> BalloonMarking.fireTopicPublisherTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
+        return null;
+    }
+
+    public Optional<BalloonMarking> BalloonMarking.fireServiceServerTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
+        return null;
+    }
+
     public BalloonCallbackStorage PetriNet.initializeCallbackStorage() {
 
         BalloonCallbackStorage storage = new BalloonCallbackStorage();
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java
index 4856622..fe60b58 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java
@@ -14,7 +14,7 @@ public class Main {
 
     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
 
-        String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-2.pnml";
+        String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-3.pnml";
         PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
 
         BalloonMarking bm = petriNet.initializeBalloonMarking();
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java
index cce1f5d..cac9b55 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java
@@ -4,6 +4,7 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public abstract class TransitionCallback {
@@ -12,6 +13,13 @@ public abstract class TransitionCallback {
 
     private String id;
     private int priority;
+    private List<String> params = new ArrayList<>();
+
+    public TransitionCallback(String id, int priority, List<String> params) {
+        this.id = id;
+        this.priority = priority;
+        this.params.addAll(params);
+    }
 
     public TransitionCallback(String id, int priority) {
         this.id = id;
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java
new file mode 100644
index 0000000..d694532
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java
@@ -0,0 +1,10 @@
+package de.tudresden.inf.st.pnml.engine.ros;
+
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+
+public class DiNeRosDefaultNode extends DiNeRosNode{
+
+    public DiNeRosDefaultNode(String nodeName, PetriNet petriNet) {
+        super(nodeName, petriNet);
+    }
+}
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
new file mode 100644
index 0000000..54890c6
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
@@ -0,0 +1,85 @@
+package de.tudresden.inf.st.pnml.engine.ros;
+
+import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
+import de.tudresden.inf.st.pnml.engine.transform.TopicTransformer;
+import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage;
+import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking;
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+import de.tudresden.inf.st.pnml.jastadd.model.Transition;
+import org.ros.namespace.GraphName;
+import org.ros.node.AbstractNodeMain;
+import org.ros.node.ConnectedNode;
+import org.ros.node.topic.Subscriber;
+import org.xml.sax.SAXException;
+import std_msgs.String;
+
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public abstract class DiNeRosNode extends AbstractNodeMain {
+
+    public final java.lang.String nodeName;
+    public final PetriNet petriNet;
+    private BalloonMarking marking;
+    private BalloonCallbackStorage callbackStorage;
+    private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>();
+
+    public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet){
+        this.nodeName = nodeName;
+        this.petriNet = petriNet;
+        try {
+            marking = petriNet.initializeBalloonMarking();
+            callbackStorage = petriNet.initializeCallbackStorage();
+        } catch (IOException | SAXException | ParserConfigurationException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public GraphName getDefaultNodeName() {
+        return GraphName.of(nodeName);
+    }
+
+    @Override
+    public void onStart(final ConnectedNode connectedNode) {
+
+        int inCount = 0;
+
+        for(Transition t : petriNet.allTransitions()){
+            if(t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TOPIC_SUBSCRIBER)
+                    || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_OUT)
+                    || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_OUT)){
+
+                Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition()
+                        .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE);
+
+                int finalInCount = inCount;
+                subscriber.addMessageListener(message -> {
+
+                    List<java.lang.String> addedElementIds = new ArrayList<>();
+                    TopicTransformer.includeSubscriberInstance(petriNet, t.asInputSignalTransition()
+                            .getStaticTransitionInformation().getSubNet(), java.lang.String.valueOf(finalInCount), addedElementIds);
+
+                    for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : dinerosSubscribers.entrySet()) {
+                        if(entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())){
+                            entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet());
+                            TopicTransformer.removeSubscriberInstance(petriNet, addedElementIds);
+                            break;
+                        }
+                    }
+                });
+
+                inCount++;
+            }
+        }
+
+    }
+
+    public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() {
+        return dinerosSubscribers;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java
new file mode 100644
index 0000000..f93a6cc
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java
@@ -0,0 +1,10 @@
+package de.tudresden.inf.st.pnml.engine.ros;
+
+import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage;
+import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking;
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+
+public interface DiNeRosSubscriber {
+
+    public boolean execute(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String subnet);
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java
new file mode 100644
index 0000000..a75a2cd
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java
@@ -0,0 +1,54 @@
+package de.tudresden.inf.st.pnml.engine.ros;
+
+import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking;
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+import de.tudresden.inf.st.pnml.jastadd.model.Transition;
+import org.ros.node.ConnectedNode;
+import org.ros.node.topic.Publisher;
+import org.ros.node.topic.Subscriber;
+import std_msgs.String;
+
+import java.nio.charset.StandardCharsets;
+import java.util.function.BiConsumer;
+
+import org.ros.message.MessageListener;
+
+public class RosCommunicationUtil {
+
+    public static boolean publish(java.lang.String topic, byte[] msgContent, ConnectedNode node){
+
+        System.out.println("Publishing new message to " + topic);
+        Publisher<std_msgs.String> pub = node.newPublisher(topic, std_msgs.String._TYPE);
+
+        if(pub == null){
+            while(true){
+                if(node != null){
+                    break;
+                }
+            }
+
+            std_msgs.String msg = pub.newMessage();
+            java.lang.String s = new java.lang.String(msgContent, StandardCharsets.UTF_8);
+            msg.setData(s);
+            pub.publish(msg);
+
+            return true;
+        }
+        return false;
+    }
+
+    public static Subscriber listen(java.lang.String topic, ConnectedNode node, Transition t, PetriNet pn, BalloonMarking bm){
+
+        Subscriber<String> subscriber = node.newSubscriber(topic, std_msgs.String._TYPE);
+  //      subscriber.addMessageListener(message -> callback.accept(topic, message.getData().getBytes()));
+
+        subscriber.addMessageListener(message -> {
+
+
+
+        });
+
+        return subscriber;
+
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java
new file mode 100644
index 0000000..ff94618
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java
@@ -0,0 +1,4 @@
+package de.tudresden.inf.st.pnml.engine.transform;
+
+public class ServiceTransformer {
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java
new file mode 100644
index 0000000..efb009e
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java
@@ -0,0 +1,221 @@
+package de.tudresden.inf.st.pnml.engine.transform;
+
+import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
+import de.tudresden.inf.st.pnml.jastadd.model.*;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class TopicTransformer {
+
+    public static PetriNet includeSubscriberInstance(PetriNet petriNet, String subnet, String suffix, List<String> addedElementIds){
+
+        Page topPage = petriNet.getPage(0);
+
+        // Elements
+        for (Place p : getPlacesBySubnet(petriNet, subnet)) {
+
+            OutputSignalPlace copy = getOutputSignalPlace();
+            copy.setId(p.getId() + "-" + suffix);
+            copy.setToolspecificList(p.getToolspecificList().treeCopy());
+            copy.getName().setText(p.getName().getText());
+            copy.setNodeGraphics(p.getNodeGraphics().treeCopy());
+
+            // copy initial marking of places
+            PTMarking m = new PTMarking();
+            m.setText(p.getInitialMarking().getText());
+
+            PlaceInformation pi = new PlaceInformation();
+            pi.setSubNet(p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet() + "-" + suffix);
+            pi.setLocation(p.asOutputSignalPlace().getStaticPlaceInformation().getLocation());
+            pi.setInstance(p.asOutputSignalPlace().getStaticPlaceInformation().getInstance());
+            pi.setType(p.asOutputSignalPlace().getStaticPlaceInformation().getType());
+
+            copy.setMutualPlaceInformation(pi);
+
+            topPage.addObject(copy);
+            addedElementIds.add(copy.getId());
+        }
+
+        petriNet.flushTreeCache();
+
+        for (Transition t : getTransitionsBySubnet(petriNet, subnet)) {
+            InputSignalTransition copy = getInputSignalTransition();
+            copy.setId(t.getId() + "-" + suffix);
+            copy.getName().setText(t.getName().getText());
+            copy.setMutualInputSignalBindingList(t.asInputSignalTransition().getMutualInputSignalBindingList().treeCopy());
+            copy.getName().setText(t.getName().getText());
+            copy.setToolspecificList(t.getToolspecificList().treeCopy());
+            copy.setNodeGraphics(t.getNodeGraphics().treeCopy());
+
+            TransitionInformation ti = new DefaultTransitionInformation();
+            ti.setType(t.asInputSignalTransition().getStaticTransitionInformation().getType());
+            ti.setSubNet(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet() + "-" + suffix);
+            ti.setLocation(t.asInputSignalTransition().getStaticTransitionInformation().getLocation());
+            ti.setInstance(t.asInputSignalTransition().getStaticTransitionInformation().getInstance());
+            copy.setMutualTransitionInformation(ti);
+
+            topPage.addObject(copy);
+            addedElementIds.add(copy.getId());
+        }
+
+        petriNet.flushTreeCache();
+
+        // Arcs
+        for (Arc a : getInnerAndBorderSubnetArcs(petriNet, subnet)) {
+
+            Arc newArc = a.treeCopy();
+
+            String sourceId = a.getSource().getId() + "-" + suffix;
+            newArc.setSource((Node) getPnObjectByID(petriNet, sourceId));
+
+            String targetId = a.getTarget().getId() + "-" + suffix;
+
+            if(a.getTarget().isTransitionNode()){
+                if(!a.getTarget().asTransitionNode().asTransition().asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)){
+                    targetId = a.getTarget().getId();
+                }
+            }
+
+            if(a.getTarget().isPlaceNode()){
+                if(!a.getTarget().asPlaceNode().asPlace().asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)){
+                    targetId = a.getTarget().getId();
+                }
+            }
+
+            newArc.setTarget((Node) getPnObjectByID(petriNet, targetId));
+            newArc.setId(sourceId + "-to-" + targetId);
+
+            topPage.addObject(newArc);
+            addedElementIds.add(newArc.getId());
+        }
+
+        // TODO: references
+
+        petriNet.flushTreeCache();
+
+        return petriNet;
+    }
+
+    public static PetriNet removeSubscriberInstance(PetriNet petriNet, List<String> addedElementIds){
+
+        for(String id : addedElementIds){
+            getPnObjectByID(petriNet, id).removeSelf();
+        }
+
+        petriNet.flushTreeCache();
+        return petriNet;
+    }
+
+    private static Set<Arc> getInnerAndBorderSubnetArcs(PetriNet petriNet, String subnet) {
+
+        Set<Arc> arcs = new HashSet<>();
+
+        for (Arc a : petriNet.allArcs()) {
+
+            if(a.getTarget().isTransitionNode() && a.getSource().isPlaceNode()){
+
+                if(a.getSource().asPlaceNode().asPlace().asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)){
+                    arcs.add(a);
+                }
+
+            } else {
+                if(a.getSource().asTransitionNode().asTransition().asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)){
+                    arcs.add(a);
+                }
+            }
+        }
+
+        return arcs;
+    }
+
+    private static InputSignalTransition getInputSignalTransition(){
+
+        PetriNet templateNet = PnmlParser.parsePnml(System.getProperty("user.dir") + "/src/main/resources/elements/InputSignalTransition.pnml").get(0);
+
+        for(Transition t : templateNet.allTransitions()){
+            if(t.getId().equals("InputSignalTransition")){
+                return t.asInputSignalTransition();
+            }
+        }
+
+        return null;
+    }
+
+    private static OutputSignalPlace getOutputSignalPlace(){
+
+        PetriNet templateNet = PnmlParser.parsePnml(System.getProperty("user.dir") + "/src/main/resources/elements/OutputSignalPlace.pnml").get(0);
+
+        for(Place p : templateNet.allPlaces()){
+            if(p.getId().equals("OutputSignalPlace")){
+                return p.asOutputSignalPlace();
+            }
+        }
+
+        return null;
+    }
+
+    private static PnObject getPnObjectByID(PetriNet petriNet, String Id) {
+
+        for (PnObject po : petriNet.allObjects()) {
+            if (po.getId().equals(Id)) {
+                return po;
+            }
+        }
+
+        return null;
+    }
+
+    private static Set<Place> getPlacesBySubnet(PetriNet petriNet, String subnet) {
+
+        Set<Place> places = new HashSet<>();
+
+        for (Place p : petriNet.allPlaces()) {
+            if (p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)) {
+                places.add(p);
+            }
+        }
+
+        return places;
+    }
+
+    private static Set<Transition> getTransitionsBySubnet(PetriNet petriNet, String subnet) {
+
+        Set<Transition> transitions = new HashSet<>();
+
+        for (Transition t : petriNet.allTransitions()) {
+            if (t.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)) {
+                transitions.add(t);
+            }
+        }
+
+        return transitions;
+    }
+
+    private static Set<RefPlace> getRefPlaceBySubnet(PetriNet petriNet, String subnet) {
+
+        Set<RefPlace> places = new HashSet<>();
+
+        for (RefPlace rp : petriNet.allRefPlaces()) {
+            if (rp.getSubNet().equals(subnet)) {
+                places.add(rp);
+            }
+        }
+
+        return places;
+    }
+
+    private static Set<RefTransition> getRefTransitionBySubnet(PetriNet petriNet, String subnet) {
+
+        Set<RefTransition> transitions = new HashSet<>();
+
+        for (RefTransition rt : petriNet.allRefTransitions()) {
+            if (rt.getSubNet().equals(subnet)) {
+                transitions.add(rt);
+            }
+        }
+
+        return transitions;
+    }
+}
diff --git a/src/main/resources/elements/InputSignalTransition.pnml b/src/main/resources/elements/InputSignalTransition.pnml
new file mode 100644
index 0000000..a94aa63
--- /dev/null
+++ b/src/main/resources/elements/InputSignalTransition.pnml
@@ -0,0 +1,29 @@
+<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
+    <net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
+        <name>
+            <text>InputSignalTransitionNet</text>
+        </name>
+        <page id="InputSignalTransitionPage">
+            <transition id="InputSignalTransition">
+                <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    <location>none</location>
+                    <subnet>none</subnet>
+                    <type>discreteTransitionType</type>
+                    <inputsignalbindings>
+                    </inputsignalbindings>
+                    <inputsignalclause></inputsignalclause>
+                </toolspecific>
+                <name>
+                    <text>ServiceClientOutputTransition</text>
+                    <graphics>
+                        <offset x="0" y="0" />
+                    </graphics>
+                </name>
+                <graphics>
+                    <position x="0" y="0"/>
+                </graphics>
+            </transition>
+
+        </page>
+    </net>
+</pnml>
\ No newline at end of file
diff --git a/src/main/resources/elements/OutputSignalPlace.pnml b/src/main/resources/elements/OutputSignalPlace.pnml
new file mode 100644
index 0000000..a9ab44b
--- /dev/null
+++ b/src/main/resources/elements/OutputSignalPlace.pnml
@@ -0,0 +1,30 @@
+<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
+    <net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
+        <name>
+            <text>OutputSignalPlaceNet</text>
+        </name>
+        <page id="OutputSignalPlacePage">
+            <place id="OutputSignalPlace">
+                <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    <location>none</location>
+                    <subnet>none</subnet>
+                    <type>discretePlaceType</type>
+                    <outputsignalbindings>
+                    </outputsignalbindings>
+                </toolspecific>
+                <name>
+                    <text>ServiceTogglePlace</text>
+                    <graphics>
+                        <offset x="0" y="0" />
+                    </graphics>
+                </name>
+                <initialMarking>
+                    <text>0</text>
+                </initialMarking>
+                <graphics>
+                    <position x="0" y="0"/>
+                </graphics>
+            </place>
+        </page>
+    </net>
+</pnml>
\ No newline at end of file
-- 
GitLab