diff --git a/ControllerDataFlow.svg b/ControllerDataFlow.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8aeeeec35b77a47e551d19034319f79ad251e011
--- /dev/null
+++ b/ControllerDataFlow.svg
@@ -0,0 +1,2 @@
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" style="background-color: rgb(255, 255, 255);" xmlns:xlink="http://www.w3.org/1999/xlink" width="1519px" height="724px" version="1.1" content="&lt;mxfile userAgent=&quot;Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0&quot; version=&quot;6.0.2.8&quot; editor=&quot;www.draw.io&quot; type=&quot;device&quot;&gt;&lt;diagram name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g transform="translate(0.5,0.5)"><path d="M 262 25 L 262 2 L 882 2 L 882 25 Z" fill="#dae8fc" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="none"/><path d="M 262 25 L 262 722 L 882 722 L 882 25" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(563.5,5.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="15" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 16px; white-space: nowrap; overflow-wrap: normal; font-weight: bold; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">RT</div></div></foreignObject><text x="8" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica" font-weight="bold">RT</text></switch></g><path d="M 437.33 131.67 L 307.33 131.67 L 307.33 118.03" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 307.33 112.78 L 310.83 119.78 L 307.33 118.03 L 303.83 119.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(334.5,124.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="74" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Read Targets<br /></div></div></foreignObject><text x="37" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Read Targets&lt;br&gt;</text></switch></g><path d="M 477.33 101.67 L 592.33 101.67 L 625.97 101.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 631.22 101.67 L 624.22 105.17 L 625.97 101.67 L 624.22 98.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(505.5,86.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="87" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Read &amp; Decode<br />State<br /></div></div></foreignObject><text x="44" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Read &amp;amp; Decode&lt;br&gt;State&lt;br&gt;</text></switch></g><rect x="398" y="82" width="120" height="40" fill="#ffffff" stroke="#000000" transform="rotate(270,458,102)" pointer-events="none"/><g transform="translate(413.5,94.5)rotate(270,43,8)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="86" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 87px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">EtherCAT Buffer<br /></div></div></foreignObject><text x="43" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">EtherCAT Buffer&lt;br&gt;</text></switch></g><path d="M 307.33 91.67 L 307.33 71.67 L 430.97 71.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 436.22 71.67 L 429.22 75.17 L 430.97 71.67 L 429.22 68.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(343.5,64.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="59" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Write State<br /></div></div></foreignObject><text x="30" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Write State&lt;br&gt;</text></switch></g><path d="M 232 82 L 292 82 L 322 102 L 292 122 L 232 122 L 202 102 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(231.5,92.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="59" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 60px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">EtherCAT()</div></div></foreignObject><text x="30" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">EtherCAT()</text></switch></g><path d="M 457.33 286.67 L 457.33 168.03" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 457.33 162.78 L 460.83 169.78 L 457.33 168.03 L 453.83 169.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(415.5,246.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="84" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Encode &amp; Write <br />Target i<br /></div></div></foreignObject><text x="42" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="403" y="287" width="110" height="30" fill="#ffffff" stroke="#000000" pointer-events="none"/><rect x="405" y="289" width="106" height="26" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(411.5,292.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="90" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 91px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">LVL0 Controller i<br /></div></div></foreignObject><text x="45" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">LVL0 Controller i&lt;br&gt;</text></switch></g><rect x="632" y="87" width="120" height="30" fill="#ffffff" stroke="#000000" pointer-events="none"/><rect x="634" y="89" width="116" height="26" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(645.5,92.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="90" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 91px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Internal XYZ Unit</div></div></foreignObject><text x="45" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Internal XYZ Unit</text></switch></g><path d="M 402.33 496.67 L 282.33 496.67 L 282.33 201.67 L 457.33 201.67 L 457.56 168.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 457.59 163.12 L 461.04 170.14 L 457.56 168.37 L 454.04 170.09 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(305.5,481.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="84" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Encode &amp; Write<br />Target j<br /></div></div></foreignObject><text x="42" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Encode &amp;amp; Write&lt;br&gt;Target j&lt;br&gt;</text></switch></g><rect x="403" y="482" width="110" height="30" fill="#ffffff" stroke="#000000" pointer-events="none"/><rect x="405" y="484" width="106" height="26" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(411.5,487.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="90" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 91px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">LVL0 Controller j<br /></div></div></foreignObject><text x="45" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">LVL0 Controller j&lt;br&gt;</text></switch></g><path d="M 402.33 541.67 L 282.33 541.67 L 282.33 201.67 L 457.33 201.67 L 457.33 168.03" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 457.33 162.78 L 460.83 169.78 L 457.33 168.03 L 453.83 169.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(304.5,525.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="84" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Encode &amp; Write<br />Target k<br /></div></div></foreignObject><text x="42" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Encode &amp;amp; Write&lt;br&gt;Target k&lt;br&gt;</text></switch></g><rect x="403" y="527" width="110" height="30" fill="#ffffff" stroke="#000000" pointer-events="none"/><rect x="405" y="529" width="106" height="26" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(410.5,532.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="93" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 94px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">LVL0 Controller k<br /></div></div></foreignObject><text x="47" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">LVL0 Controller k&lt;br&gt;</text></switch></g><rect x="403" y="572" width="110" height="30" fill="#ffffff" stroke="#000000" pointer-events="none"/><rect x="405" y="574" width="106" height="26" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(411.5,577.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="90" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 91px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">LVL0 Controller l<br /></div></div></foreignObject><text x="45" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">LVL0 Controller l&lt;br&gt;</text></switch></g><path d="M 402.33 586.67 L 282.33 586.67 L 282.33 201.67 L 457.33 201.67 L 457.33 168.03" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 457.33 162.78 L 460.83 169.78 L 457.33 168.03 L 453.83 169.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(304.5,570.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="84" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Encode &amp; Write<br />Target l<br /></div></div></foreignObject><text x="42" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Encode &amp;amp; Write&lt;br&gt;Target l&lt;br&gt;</text></switch></g><path d="M 942 25 L 942 2 L 1462 2 L 1462 25 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="none"/><path d="M 942 25 L 942 722 L 1462 722 L 1462 25" fill="none" stroke="#d79b00" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(1180.5,5.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="40" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 41px; white-space: nowrap; overflow-wrap: normal; font-weight: bold; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Non RT<br /></div></div></foreignObject><text x="20" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica" font-weight="bold">Non RT&lt;br&gt;</text></switch></g><path d="M 1282.33 78.33 L 1352.33 78.33 L 1352.33 56.67 L 1415.63 56.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 1420.88 56.67 L 1413.88 60.17 L 1415.63 56.67 L 1413.88 53.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="1163" y="71" width="120" height="30" fill="#ffffff" stroke="#000000" pointer-events="none"/><rect x="1165" y="73" width="116" height="26" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(1170.5,76.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="102" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 103px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Publisher XYZ Unit</div></div></foreignObject><text x="51" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Publisher XYZ Unit</text></switch></g><path d="M 1412.33 101.67 L 1347.33 101.67 L 1347.33 93.33 L 1288.7 93.33" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 1283.45 93.33 L 1290.45 89.83 L 1288.7 93.33 L 1290.45 96.83 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 1412 102 L 1435.75 87 L 1492 87 Q 1507 87 1507 102 Q 1507 117 1492 117 L 1435.75 117 Z" fill-opacity="0.9" fill="#ffffff" stroke="#000000" stroke-opacity="0.9" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(1424.5,92.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="67" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 68px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">SetTargets()<br /></div></div></foreignObject><text x="34" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">SetTargets()&lt;br&gt;</text></switch></g><path d="M 1422 57 L 1445.75 42 L 1502 42 Q 1517 42 1517 57 Q 1517 72 1502 72 L 1445.75 72 Z" fill-opacity="0.9" fill="#ffffff" stroke="#000000" stroke-opacity="0.9" stroke-miterlimit="10" transform="translate(1469.5,0)scale(-1,1)translate(-1469.5,0)" pointer-events="none"/><g transform="translate(1429.5,47.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="78" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 79px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PublishState()<br /></div></div></foreignObject><text x="39" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PublishState()&lt;br&gt;</text></switch></g><path d="M 80.67 126.67 L 160.67 126.67 L 217.33 126.67 L 217.33 118.03" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 217.33 112.78 L 220.83 119.78 L 217.33 118.03 L 213.83 119.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(115.5,119.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="75" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Receive State<br /></div></div></foreignObject><text x="38" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Receive State&lt;br&gt;</text></switch></g><path d="M 12 76.98 C 12 74.23 14.24 72 17 72 L 85 72 C 87.76 72 90 74.23 90 76.98 L 90 116.79 C 77.54 111.54 63.46 111.54 51 116.79 C 38.54 122.05 24.46 122.05 12 116.79 Z" fill="#ffffff" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><path d="M 7 81.95 C 7 80.63 7.53 79.37 8.46 78.43 C 9.4 77.5 10.67 76.98 12 76.98 L 80 76.98 C 81.33 76.98 82.6 77.5 83.54 78.43 C 84.47 79.37 85 80.63 85 81.95 L 85 121.77 C 72.54 116.51 58.46 116.51 46 121.77 C 33.54 127.02 19.46 127.02 7 121.77 Z" fill="#ffffff" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><path d="M 2 86.93 C 2 84.18 4.24 81.95 7 81.95 L 75 81.95 C 77.76 81.95 80 84.18 80 86.93 L 80 126.74 C 67.54 121.49 53.46 121.49 41 126.74 C 28.54 132 14.46 132 2 126.74 Z" fill="#ffffff" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(4.5,86.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="83" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 83px; white-space: normal; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Joint Controllers<br /></div></div></foreignObject><text x="42" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Joint Controllers&lt;br&gt;</text></switch></g><path d="M 217.33 91.67 L 217.33 78.33 L 160.67 78.33 L 92.03 78.33" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 86.78 78.33 L 93.78 74.83 L 92.03 78.33 L 93.78 81.83 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(104.5,69.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="73" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Send Targets<br /></div></div></foreignObject><text x="37" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Send Targets&lt;br&gt;</text></switch></g><path d="M 822 57 L 822 34 L 1002 34 L 1002 57 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 822 57 L 822 164 L 1002 164 L 1002 57" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(834.5,37.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="153" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 154px; white-space: nowrap; overflow-wrap: normal; font-weight: bold; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Tripple Buffer -&gt; (EtherCAT)<br /></div></div></foreignObject><text x="77" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica" font-weight="bold">Tripple Buffer -&amp;gt; (EtherCAT)&lt;br&gt;</text></switch></g><rect x="807" y="94" width="90" height="30" fill="#ffffff" stroke="#000000" transform="rotate(270,852,109)" pointer-events="none"/><g transform="translate(819.5,101.5)rotate(270,31.5,8)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="63" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 64px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Write Buffer<br /></div></div></foreignObject><text x="32" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Write Buffer&lt;br&gt;</text></switch></g><rect x="929" y="94" width="90" height="30" fill="#ffffff" stroke="#000000" transform="rotate(270,974,109)" pointer-events="none"/><g transform="translate(940.5,101.5)rotate(270,32.5,8)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="65" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 66px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Read Buffer<br /></div></div></foreignObject><text x="33" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Read Buffer&lt;br&gt;</text></switch></g><rect x="868" y="94" width="90" height="30" fill="#ffffff" stroke="#000000" transform="rotate(270,913,109)" pointer-events="none"/><g transform="translate(874.5,101.5)rotate(270,37.5,8)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="75" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 76px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Hidden Buffer<br /></div></div></foreignObject><text x="38" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Hidden Buffer&lt;br&gt;</text></switch></g><path d="M 477.33 71.67 L 542.33 71.67 L 542.33 51.67 L 802.33 51.67 L 802.33 86.67 L 830.97 86.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 836.22 86.67 L 829.22 90.17 L 830.97 86.67 L 829.22 83.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(628.5,43.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="74" height="11" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Memcopy State<br /></div></div></foreignObject><text x="37" y="11" fill="#000000" text-anchor="middle" font-size="11px" font-family="Helvetica">Memcopy State&lt;br&gt;</text></switch></g><path d="M 989 86.67 L 1037.33 86.67 L 1155.97 86.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 1161.22 86.67 L 1154.22 90.17 L 1155.97 86.67 L 1154.22 83.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(1036.5,71.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="87" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Read &amp; Decode<br />State<br /></div></div></foreignObject><text x="44" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Read &amp;amp; Decode&lt;br&gt;State&lt;br&gt;</text></switch></g><path d="M 709 215 L 709 192 L 1115 192 L 1115 215 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 709 215 L 709 392 L 1115 392 L 1115 215" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(833.5,195.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="155" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 156px; white-space: nowrap; overflow-wrap: normal; font-weight: bold; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">LVL1 Ice enabled Controller<br /></div></div></foreignObject><text x="78" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica" font-weight="bold">LVL1 Ice enabled Controller&lt;br&gt;</text></switch></g><path d="M 822 250 L 822 227 L 1002 227 L 1002 250 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 822 250 L 822 357 L 1002 357 L 1002 250" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(827.5,230.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="166" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 167px; white-space: nowrap; overflow-wrap: normal; font-weight: bold; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Tripple Buffer &lt;- (Commands)<br /></div></div></foreignObject><text x="83" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica" font-weight="bold">Tripple Buffer &amp;lt;- (Commands)&lt;br&gt;</text></switch></g><rect x="807" y="287" width="90" height="30" fill="#ffffff" stroke="#000000" transform="rotate(270,852,302)" pointer-events="none"/><g transform="translate(818.5,294.5)rotate(270,32.5,8)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="65" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 66px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Read Buffer<br /></div></div></foreignObject><text x="33" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Read Buffer&lt;br&gt;</text></switch></g><rect x="929" y="287" width="90" height="30" fill="#ffffff" stroke="#000000" transform="rotate(270,974,302)" pointer-events="none"/><g transform="translate(941.5,294.5)rotate(270,31.5,8)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="63" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 64px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Write Buffer<br /></div></div></foreignObject><text x="32" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Write Buffer&lt;br&gt;</text></switch></g><rect x="868" y="287" width="90" height="30" fill="#ffffff" stroke="#000000" transform="rotate(270,913,302)" pointer-events="none"/><g transform="translate(874.5,294.5)rotate(270,37.5,8)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="75" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 76px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Hidden Buffer<br /></div></div></foreignObject><text x="38" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Hidden Buffer&lt;br&gt;</text></switch></g><path d="M 1083 302 L 1106.75 287 L 1163 287 Q 1178 287 1178 302 Q 1178 317 1163 317 L 1106.75 317 Z" fill-opacity="0.9" fill="#ffffff" stroke="#000000" stroke-opacity="0.9" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(1093.5,292.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="71" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 72px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">IceFunction()<br /></div></div></foreignObject><text x="36" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">IceFunction()&lt;br&gt;</text></switch></g><path d="M 1082.33 301.67 L 1035.67 301.67 L 995.37 301.88" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 990.12 301.91 L 997.1 298.38 L 995.37 301.88 L 997.14 305.37 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(1009.5,286.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="66" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Write <br />Commands<br /></div></div></foreignObject><text x="33" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Write &lt;br&gt;Commands&lt;br&gt;</text></switch></g><path d="M 683.25 287 L 721.75 287 L 741 302 L 721.75 317 L 683.25 317 L 664 302 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(685.5,292.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="31" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 32px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Run()</div></div></foreignObject><text x="16" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Run()</text></switch></g><path d="M 837.33 301.67 L 747.03 301.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 741.78 301.67 L 748.78 298.17 L 747.03 301.67 L 748.78 305.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(754.5,286.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="66" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Read<br />Commands<br /></div></div></foreignObject><text x="33" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Read&lt;br&gt;Commands&lt;br&gt;</text></switch></g><path d="M 664 301.67 L 518.7 301.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 513.45 301.67 L 520.45 298.17 L 518.7 301.67 L 520.45 305.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(575.5,294.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="71" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Write Target i<br /></div></div></foreignObject><text x="36" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Write Target i&lt;br&gt;</text></switch></g><path d="M 692.33 116.67 L 692.33 201.67 L 692.33 280.3" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 692.33 285.55 L 688.83 278.55 L 692.33 280.3 L 695.83 278.55 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(662.5,154.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="61" height="11" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Read Values<br /></div></div></foreignObject><text x="31" y="11" fill="#000000" text-anchor="middle" font-size="11px" font-family="Helvetica">Read Values&lt;br&gt;</text></switch></g><path d="M 709 455 L 709 432 L 1115 432 L 1115 455 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 709 455 L 709 632 L 1115 632 L 1115 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(829.5,435.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="163" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 164px; white-space: nowrap; overflow-wrap: normal; font-weight: bold; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">LVL1 Passthrough Controller<br /></div></div></foreignObject><text x="82" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica" font-weight="bold">LVL1 Passthrough Controller&lt;br&gt;</text></switch></g><path d="M 1083 542 L 1106.75 527 L 1163 527 Q 1178 527 1178 542 Q 1178 557 1163 557 L 1106.75 557 Z" fill-opacity="0.9" fill="#ffffff" stroke="#000000" stroke-opacity="0.9" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(1095.5,532.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="67" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 68px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">SetTargets()<br /></div></div></foreignObject><text x="34" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">SetTargets()&lt;br&gt;</text></switch></g><path d="M 1082.33 541.67 L 933.7 541.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 928.45 541.67 L 935.45 538.17 L 933.7 541.67 L 935.45 545.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(986.5,526.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="41" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Write <br />Targets<br /></div></div></foreignObject><text x="21" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 683.25 527 L 721.75 527 L 741 542 L 721.75 557 L 683.25 557 L 664 542 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(685.5,532.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="31" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 32px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Run()</div></div></foreignObject><text x="16" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Run()</text></switch></g><path d="M 897.33 541.67 L 747.03 541.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 741.78 541.67 L 748.78 538.17 L 747.03 541.67 L 748.78 545.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(792.5,526.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="41" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Read<br />Targets<br /></div></div></foreignObject><text x="21" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="867" y="527" width="90" height="30" fill="#ffffff" stroke="#000000" transform="rotate(270,912,542)" pointer-events="none"/><g transform="translate(871.5,534.5)rotate(270,39.5,8)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="79" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 80px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Atomics Buffer<br /></div></div></foreignObject><text x="40" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Atomics Buffer&lt;br&gt;</text></switch></g><path d="M 664 541.67 L 518.7 541.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 513.45 541.67 L 520.45 538.17 L 518.7 541.67 L 520.45 545.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(532.5,534.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="74" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Write Target k<br /></div></div></foreignObject><text x="37" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Write Target k&lt;br&gt;</text></switch></g><path d="M 664 541.67 L 622.33 541.67 L 622.33 496.67 L 518.7 496.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 513.45 496.67 L 520.45 493.17 L 518.7 496.67 L 520.45 500.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(533.5,489.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="71" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Write Target j<br /></div></div></foreignObject><text x="36" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Write Target j&lt;br&gt;</text></switch></g><path d="M 664 541.67 L 622.33 541.67 L 622.33 586.67 L 518.7 586.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 513.45 586.67 L 520.45 583.17 L 518.7 586.67 L 520.45 590.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(532.5,579.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="71" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Write Target l<br /></div></div></foreignObject><text x="36" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Write Target l&lt;br&gt;</text></switch></g><path d="M 1222.33 101.67 L 1222.33 541.67 L 1183.7 541.67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 1178.45 541.67 L 1185.45 538.17 L 1183.7 541.67 L 1185.45 545.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(1189.5,210.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="62" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;">Set Targets<br /></div></div></foreignObject><text x="31" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Set Targets&lt;br&gt;</text></switch></g></g></svg>
\ No newline at end of file
diff --git a/ControllerDataFlow.xml b/ControllerDataFlow.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d1c16e7190f150233b1f5e7817ef7269b31e5b2c
--- /dev/null
+++ b/ControllerDataFlow.xml
@@ -0,0 +1 @@
+<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0" version="6.0.2.8" editor="www.draw.io" type="device"><diagram name="Page-1">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</diagram></mxfile>
\ No newline at end of file
diff --git a/etc/doxygen/pages/armarpose.dox b/etc/doxygen/pages/armarpose.dox
index 1b2b13736d32f4e5478230f657248452e4bd13ea..c3c4b2494f9de2f04f007489180acdfb40b8ce70 100644
--- a/etc/doxygen/pages/armarpose.dox
+++ b/etc/doxygen/pages/armarpose.dox
@@ -17,7 +17,7 @@ function.
 \section FramedPose-Possible-Frames Frames of coordinates
 The frame of FramedX or LinkedX is technically just a string.
 The possible values are the names of the robot nodes (use \ref RobotAPI-HowTos-RobotViewer "RobotViewer" app of Simox to inspect them).
-For global poses the exists the global constant string variable armarx::GlobalFrame located in the FramedPose.h.
+For global poses exists the global constant string variable armarx::GlobalFrame located in the FramedPose.h.
 Use this variable if you specify global poses and an empty Agent-string. Empty frames should be avoided (though, an empty string is mostly considered as the global frame).
 
 \section FramedPose-FramedPositionCreation Creation of new FramedPositions
diff --git a/source/RobotAPI/components/units/CMakeLists.txt b/source/RobotAPI/components/units/CMakeLists.txt
index 94ed1485e1eabb750ad5ae80748008faea129bc6..90567cf96caddb0d174100b504237265888f06a2 100644
--- a/source/RobotAPI/components/units/CMakeLists.txt
+++ b/source/RobotAPI/components/units/CMakeLists.txt
@@ -74,3 +74,5 @@ set(LIB_FILES
 )
 
 armarx_add_library("${LIB_NAME}"  "${LIB_FILES}" "${LIB_HEADERS}" "${LIBS}")
+
+add_subdirectory(relays)
diff --git a/source/RobotAPI/components/units/PlatformUnitSimulation.cpp b/source/RobotAPI/components/units/PlatformUnitSimulation.cpp
index 6a978e80120f45608b2c54685653ee90bf3868a1..75fcbca37ad130dd9e19c9455ad10dbe6d166581 100644
--- a/source/RobotAPI/components/units/PlatformUnitSimulation.cpp
+++ b/source/RobotAPI/components/units/PlatformUnitSimulation.cpp
@@ -128,14 +128,14 @@ void PlatformUnitSimulation::simulationFunction()
             case eVelocityControl:
             {
                 Eigen::Vector2f targetVel(linearVelocityX, linearVelocityY);
+                Eigen::Rotation2Df rot(currentRotation);
+                targetVel = rot * targetVel;
                 velPID->update(timeDeltaInSeconds, currentTranslationVelocity, targetVel);
                 currentTranslationVelocity += timeDeltaInSeconds * velPID->getControlValue();
                 currentPositionX += timeDeltaInSeconds * currentTranslationVelocity[0];
                 currentPositionY += timeDeltaInSeconds * currentTranslationVelocity[1];
 
 
-                Eigen::Rotation2Df rot(currentRotation);
-                targetVel = rot * targetVel;
                 currentRotation += angularVelocity * timeDeltaInSeconds;
 
                 // stay between +/- M_2_PI
diff --git a/source/RobotAPI/components/units/relays/CMakeLists.txt b/source/RobotAPI/components/units/relays/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..26d539f34c8e5624a614fa891b8f7a19a04f01fd
--- /dev/null
+++ b/source/RobotAPI/components/units/relays/CMakeLists.txt
@@ -0,0 +1,16 @@
+set(LIB_NAME       RobotAPIUnitListenerRelays)
+armarx_set_target("RobotAPI Unit Listener Relays Library: ${LIB_NAME}")
+
+set(LIBS ArmarXCore RobotAPIInterfaces)
+
+set(LIB_HEADERS 
+    KinematicUnitListenerRelay.h
+    InertialMeasurementUnitListenerRelay.h
+    ForceTorqueUnitListenerRelay.h
+    RobotStateListenerRelay.h
+)
+
+set(LIB_FILES syntaxcheck.cpp)
+
+armarx_add_library("${LIB_NAME}"  "${LIB_FILES}" "${LIB_HEADERS}" "${LIBS}")
+
diff --git a/source/RobotAPI/components/units/relays/ForceTorqueUnitListenerRelay.h b/source/RobotAPI/components/units/relays/ForceTorqueUnitListenerRelay.h
new file mode 100644
index 0000000000000000000000000000000000000000..581a1d175f57226d5d93dfc76f18c4bed13cc9e1
--- /dev/null
+++ b/source/RobotAPI/components/units/relays/ForceTorqueUnitListenerRelay.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    VisionX::ArmarXObjects::ForceTorqueUnitListenerRelay
+ * @author     Raphael Grimm ( ufdrv at student dot kit dot edu )
+ * @date       2016
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+#include <ArmarXCore/core/ManagedIceObject.h>
+#include <ArmarXCore/core/util/noop.h>
+#include <RobotAPI/interface/units/ForceTorqueUnit.h>
+
+namespace armarx
+{
+    class ForceTorqueUnitListenerRelay :
+        virtual public ManagedIceObject,
+        virtual public ForceTorqueUnitListener
+    {
+    public:
+        using CallbackFunctionSensorValues = std::function<void(const std::string&, const FramedDirectionBasePtr&, const FramedDirectionBasePtr&)>;
+
+        // ForceTorqueUnitListener interface
+        virtual void reportSensorValues(const std::string& sensorNodeName, const FramedDirectionBasePtr& forces, const FramedDirectionBasePtr& torques, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportSensorValues(sensorNodeName, forces, torques);
+        }
+    protected:
+        // ManagedIceObject interface
+        virtual void onInitComponent()
+        {
+            usingTopic(topicName);
+        }
+        virtual void onConnectComponent() {}
+        virtual std::string getDefaultName() const
+        {
+            return "ForceTorqueUnitListenerRelay";
+        }
+    public:
+        std::string topicName;
+        CallbackFunctionSensorValues callbackReportSensorValues {noop<const std::string&, const FramedDirectionBasePtr&, const FramedDirectionBasePtr&>};
+    };
+    using ForceTorqueUnitListenerRelayPtr = IceInternal::Handle<ForceTorqueUnitListenerRelay>;
+}
diff --git a/source/RobotAPI/components/units/relays/InertialMeasurementUnitListenerRelay.h b/source/RobotAPI/components/units/relays/InertialMeasurementUnitListenerRelay.h
new file mode 100644
index 0000000000000000000000000000000000000000..69e2b0c1bab1d394517684a60ab328d3a95ec55d
--- /dev/null
+++ b/source/RobotAPI/components/units/relays/InertialMeasurementUnitListenerRelay.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    VisionX::ArmarXObjects::InertialMeasurementUnitListenerRelay
+ * @author     Raphael Grimm ( ufdrv at student dot kit dot edu )
+ * @date       2016
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+#include <ArmarXCore/core/ManagedIceObject.h>
+#include <ArmarXCore/core/util/noop.h>
+#include <RobotAPI/interface/units/InertialMeasurementUnit.h>
+
+namespace armarx
+{
+    class InertialMeasurementUnitListenerRelay :
+        virtual public ManagedIceObject,
+        virtual public InertialMeasurementUnitListener
+    {
+    public:
+        using CallbackFunctionSensorValues = std::function<void(const std::string&, const std::string&, const IMUData&, const TimestampBasePtr&)>;
+
+        // InertialMeasurementUnitListener interface
+        virtual void reportSensorValues(const std::string& device, const std::string& name, const IMUData& values, const TimestampBasePtr& timestamp, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportSensorValues(device, name, values, timestamp);
+        }
+    protected:
+        // ManagedIceObject interface
+        virtual void onInitComponent()
+        {
+            usingTopic(topicName);
+        }
+        virtual void onConnectComponent() {}
+        virtual std::string getDefaultName() const
+        {
+            return "InertialMeasurementUnitListenerRelay";
+        }
+    public:
+        std::string topicName;
+        CallbackFunctionSensorValues callbackReportSensorValues {noop<const std::string&, const std::string&, const IMUData&, const TimestampBasePtr&>};
+    };
+    using InertialMeasurementUnitListenerRelayPtr = IceInternal::Handle<InertialMeasurementUnitListenerRelay>;
+}
diff --git a/source/RobotAPI/components/units/relays/KinematicUnitListenerRelay.h b/source/RobotAPI/components/units/relays/KinematicUnitListenerRelay.h
new file mode 100644
index 0000000000000000000000000000000000000000..cbf2d2e2bab5bdc57acadcbb9b78f4fbcca806cb
--- /dev/null
+++ b/source/RobotAPI/components/units/relays/KinematicUnitListenerRelay.h
@@ -0,0 +1,94 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    VisionX::ArmarXObjects::KinematicUnitListenerRelay
+ * @author     Raphael Grimm ( ufdrv at student dot kit dot edu )
+ * @date       2016
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+#include <ArmarXCore/core/ManagedIceObject.h>
+#include <ArmarXCore/core/util/noop.h>
+#include <RobotAPI/interface/units/KinematicUnitInterface.h>
+
+namespace armarx
+{
+    class KinematicUnitListenerRelay :
+        virtual public ManagedIceObject,
+        virtual public KinematicUnitListener
+    {
+    public:
+        using CallbackFunctionModes = std::function<void(const NameControlModeMap&, Ice::Long, bool)>;
+        using CallbackFunctionState = std::function<void(const NameStatusMap&, Ice::Long, bool)>;
+        using CallbackFunctionValue = std::function<void(const NameValueMap&, Ice::Long, bool)>;
+
+        // KinematicUnitListener interface
+        virtual void reportControlModeChanged(const NameControlModeMap& map, Ice::Long time, bool changes, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportControlModeChanged(map, time, changes);
+        }
+        virtual void reportJointAngles(const NameValueMap& map, Ice::Long time, bool changes, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportJointAngles(map, time, changes);
+        }
+        virtual void reportJointVelocities(const NameValueMap& map, Ice::Long time, bool changes, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportJointVelocities(map, time, changes);
+        }
+        virtual void reportJointTorques(const NameValueMap& map, Ice::Long time, bool changes, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportJointTorques(map, time, changes);
+        }
+        virtual void reportJointAccelerations(const NameValueMap& map, Ice::Long time, bool changes, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportJointAccelerations(map, time, changes);
+        }
+        virtual void reportJointCurrents(const NameValueMap& map, Ice::Long time, bool changes, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportJointCurrents(map, time, changes);
+        }
+        virtual void reportJointMotorTemperatures(const NameValueMap& map, Ice::Long time, bool changes, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportJointMotorTemperatures(map, time, changes);
+        }
+        virtual void reportJointStatuses(const NameStatusMap& map, Ice::Long time, bool changes, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportJointStatuses(map, time, changes);
+        }
+
+    protected:
+        // ManagedIceObject interface
+        virtual void onInitComponent()
+        {
+            usingTopic(topicName);
+        }
+        virtual void onConnectComponent() {}
+        virtual std::string getDefaultName() const
+        {
+            return "KinematicUnitListenerRelay";
+        }
+    public:
+        std::string topicName;
+        CallbackFunctionModes callbackReportControlModeChanged     {noop<const NameControlModeMap&, Ice::Long, bool>};
+        CallbackFunctionValue callbackReportJointAngles            {noop<const NameValueMap&, Ice::Long, bool>};
+        CallbackFunctionValue callbackReportJointVelocities        {noop<const NameValueMap&, Ice::Long, bool>};
+        CallbackFunctionValue callbackReportJointTorques           {noop<const NameValueMap&, Ice::Long, bool>};
+        CallbackFunctionValue callbackReportJointAccelerations     {noop<const NameValueMap&, Ice::Long, bool>};
+        CallbackFunctionValue callbackReportJointCurrents          {noop<const NameValueMap&, Ice::Long, bool>};
+        CallbackFunctionValue callbackReportJointMotorTemperatures {noop<const NameValueMap&, Ice::Long, bool>};
+        CallbackFunctionState callbackReportJointStatuses          {noop<const NameStatusMap&, Ice::Long, bool>};
+    };
+    using KinematicUnitListenerRelayPtr = IceInternal::Handle<KinematicUnitListenerRelay>;
+}
diff --git a/source/RobotAPI/components/units/relays/RobotStateListenerRelay.h b/source/RobotAPI/components/units/relays/RobotStateListenerRelay.h
new file mode 100644
index 0000000000000000000000000000000000000000..839160995c58304031c199884a0e7fbac3517661
--- /dev/null
+++ b/source/RobotAPI/components/units/relays/RobotStateListenerRelay.h
@@ -0,0 +1,61 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    VisionX::ArmarXObjects::KinematicUnitListenerRelay
+ * @author     Raphael Grimm ( ufdrv at student dot kit dot edu )
+ * @date       2016
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+#include <ArmarXCore/core/ManagedIceObject.h>
+#include <ArmarXCore/core/util/noop.h>
+#include <RobotAPI/interface/core/RobotState.h>
+
+namespace armarx
+{
+    class RobotStateListenerRelay :
+        virtual public ManagedIceObject,
+        virtual public RobotStateListenerInterface
+    {
+    public:
+        using CallbackFunctionValue = std::function<void(const NameValueMap&      , Ice::Long, bool)>;
+        using CallbackFunctionPose  = std::function<void(const FramedPoseBasePtr &, Ice::Long, bool)>;
+
+        virtual void reportJointValues(const NameValueMap& map, Ice::Long time, bool changes, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportJointValues(map, time, changes);
+        }
+        void reportGlobalRobotRootPose(const FramedPoseBasePtr & pose, Ice::Long time, bool changes, const Ice::Current& = GlobalIceCurrent)
+        {
+            callbackReportGlobalRobotRootPose(pose, time, changes);
+        }
+    protected:
+        // ManagedIceObject interface
+        virtual void onInitComponent()
+        {
+            usingTopic(topicName);
+        }
+        virtual void onConnectComponent() {}
+        virtual std::string getDefaultName() const
+        {
+            return "RobotStateListener";
+        }
+    public:
+        std::string topicName;
+        CallbackFunctionValue callbackReportJointValues         {noop<const NameValueMap&      , Ice::Long, bool>};
+        CallbackFunctionPose  callbackReportGlobalRobotRootPose {noop<const FramedPoseBasePtr &, Ice::Long, bool>};
+    };
+    using RobotStateListenerRelayPtr = IceInternal::Handle<RobotStateListenerRelay>;
+}
diff --git a/source/RobotAPI/components/units/relays/syntaxcheck.cpp b/source/RobotAPI/components/units/relays/syntaxcheck.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..82b6a31b758ca9668e4219e346f9ae3be5e4a477
--- /dev/null
+++ b/source/RobotAPI/components/units/relays/syntaxcheck.cpp
@@ -0,0 +1,3 @@
+#include "KinematicUnitListenerRelay.h"
+#include "InertialMeasurementUnitListenerRelay.h"
+#include "ForceTorqueUnitListenerRelay.h"
diff --git a/source/RobotAPI/gui-plugins/DebugDrawerViewer/DebugDrawerViewerWidgetController.cpp b/source/RobotAPI/gui-plugins/DebugDrawerViewer/DebugDrawerViewerWidgetController.cpp
index 62653b98433caa6fc0a7161015624b742b03b494..b9b89a1aa2a77401face43df6c20670fbb61dde9 100644
--- a/source/RobotAPI/gui-plugins/DebugDrawerViewer/DebugDrawerViewerWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/DebugDrawerViewer/DebugDrawerViewerWidgetController.cpp
@@ -67,7 +67,7 @@ void DebugDrawerViewerWidgetController::onConnectComponent()
     // create the debugdrawer component
     std::string debugDrawerComponentName = "GUIDebugDrawer_" + getName();
     ARMARX_INFO << "Creating component " << debugDrawerComponentName;
-    debugDrawer = Component::create<DebugDrawerComponent>(properties, debugDrawerComponentName);
+    debugDrawer = Component::create<DebugDrawerComponent>(getIceProperties(), debugDrawerComponentName);
 
     if (mutex3D)
     {
diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp
index 53a516e7beeeb7119ed6bc04991e58ed9eaa23ff..b04f22369c2d16013d97c12dd9478614d5633e05 100644
--- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp
+++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp
@@ -32,6 +32,8 @@
 #include <ArmarXCore/core/ArmarXObjectScheduler.h>
 #include <ArmarXCore/core/ArmarXManager.h>
 
+#include <ArmarXCore/util/json/JSONObject.h>
+
 #include <VirtualRobot/XML/RobotIO.h>
 
 // Qt headers
@@ -44,6 +46,7 @@
 #include <QTableView>
 #include <QCheckBox>
 #include <QTableWidget>
+#include <QClipboard>
 
 #include <Inventor/SoDB.h>
 #include <Inventor/Qt/SoQt.h>
@@ -107,7 +110,7 @@ void KinematicUnitWidgetController::onInitComponent()
     // create the debugdrawer component
     std::string debugDrawerComponentName = "KinemticUnitGUIDebugDrawer_" + getName();
     ARMARX_INFO << "Creating component " << debugDrawerComponentName;
-    debugDrawer = Component::create<DebugDrawerComponent>(properties, debugDrawerComponentName);
+    debugDrawer = Component::create<DebugDrawerComponent>(getIceProperties(), debugDrawerComponentName);
     showVisuLayers(false);
 
     if (mutex3D)
@@ -160,7 +163,7 @@ void KinematicUnitWidgetController::onConnectComponent()
         packages.push_back(Application::GetProjectName());
         ARMARX_VERBOSE << "ArmarX packages " << packages;
 
-        for (const std::string& projectName : packages)
+        for (const std::string & projectName : packages)
         {
             if (projectName.empty())
             {
@@ -336,6 +339,8 @@ void KinematicUnitWidgetController::saveSettings(QSettings* settings)
 }
 
 
+
+
 void KinematicUnitWidgetController::showVisuLayers(bool show)
 {
     if (debugDrawer)
@@ -351,6 +356,34 @@ void KinematicUnitWidgetController::showVisuLayers(bool show)
     }
 }
 
+void KinematicUnitWidgetController::copyToClipboard()
+{
+    NameValueMap values;
+    {
+        boost::recursive_mutex::scoped_lock lock(mutexNodeSet);
+
+        if (selectedControlMode == ePositionControl)
+        {
+            values = reportedJointAngles;
+        }
+        else if (selectedControlMode == eVelocityControl)
+        {
+            values = reportedJointVelocities;
+        }
+    }
+
+    JSONObjectPtr serializer = new JSONObject();
+    for (auto & kv : values)
+    {
+        serializer->setFloat(kv.first, kv.second);
+    }
+    const QString json = QString::fromStdString(serializer->asString(true));
+    QClipboard* clipboard = QApplication::clipboard();
+    clipboard->setText(json);
+    QApplication::processEvents();
+}
+
+
 void KinematicUnitWidgetController::updateGuiElements()
 {
     // modelUpdateCB();
@@ -380,6 +413,7 @@ void KinematicUnitWidgetController::connectSlots()
     connect(ui.radioButtonVelocityControl, SIGNAL(clicked(bool)), this, SLOT(setControlModeVelocity()));
     connect(ui.radioButtonTorqueControl, SIGNAL(clicked(bool)), this, SLOT(setControlModeTorque()));
 
+    connect(ui.copyToClipboard, SIGNAL(clicked()), this, SLOT(copyToClipboard()));
     connect(ui.showDebugLayer, SIGNAL(toggled(bool)), this, SLOT(showVisuLayers(bool)), Qt::QueuedConnection);
 
     connect(this, SIGNAL(jointAnglesReported()), this, SLOT(updateJointAnglesTable()), Qt::QueuedConnection);
@@ -858,14 +892,14 @@ void KinematicUnitWidgetController::updateControlModesTable()
 
             switch (currentMode)
             {
-                /*case eNoMode:
-                    state = "None";
-                    break;
-
-                case eUnknownMode:
-                    state = "Unknown";
-                    break;
-                */
+                    /*case eNoMode:
+                        state = "None";
+                        break;
+
+                    case eUnknownMode:
+                        state = "Unknown";
+                        break;
+                    */
                 case eDisabled:
                     state = "Disabled";
                     break;
@@ -1171,7 +1205,7 @@ void KinematicUnitWidgetController::reportControlModeChanged(const NameControlMo
     //        return;
     boost::recursive_mutex::scoped_lock lock(mutexNodeSet);
 
-    for (auto& e : jointModes)
+    for (auto & e : jointModes)
     {
         //        ARMARX_INFO << "Setting jointMode of joint " << e.first << " to " << e.second;
 
diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h
index 8ad61492751cd192b24fb7ceaec68dd7f901d1ea..7675b133b391f489aeb9f8d4a4d82067e2a653d9 100644
--- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h
+++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h
@@ -253,6 +253,7 @@ namespace armarx
 
     protected slots:
         void showVisuLayers(bool show);
+        void copyToClipboard();
     private:
 
         boost::recursive_mutex mutexNodeSet;
diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui
index 0df7579fe4607e0a75623700567cfc792e3ea7ac..333937df642d635cd235f3433a7637232601e0ac 100644
--- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui
+++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui
@@ -46,7 +46,14 @@
      </item>
      <item>
       <layout class="QGridLayout" name="gridLayout">
-       <item row="2" column="2" colspan="2">
+       <item row="2" column="0" colspan="2">
+        <widget class="QLabel" name="label">
+         <property name="text">
+          <string>Select Joint</string>
+         </property>
+        </widget>
+       </item>
+       <item row="2" column="2" colspan="3">
         <widget class="QComboBox" name="nodeListComboBox">
          <property name="enabled">
           <bool>true</bool>
@@ -59,7 +66,7 @@
          </property>
         </widget>
        </item>
-       <item row="3" column="2" colspan="2">
+       <item row="3" column="2" colspan="3">
         <layout class="QHBoxLayout" name="horizontalLayout">
          <item>
           <widget class="QRadioButton" name="radioButtonPositionControl">
@@ -157,10 +164,7 @@
          </item>
         </layout>
        </item>
-       <item row="4" column="2">
-        <layout class="QHBoxLayout" name="horizontalLayout_4"/>
-       </item>
-       <item row="5" column="3">
+       <item row="6" column="4">
         <widget class="QCheckBox" name="showDebugLayer">
          <property name="text">
           <string>debug layer</string>
@@ -170,29 +174,24 @@
          </property>
         </widget>
        </item>
-       <item row="5" column="2">
-        <widget class="QSlider" name="horizontalSliderKinematicUnitPos">
-         <property name="enabled">
-          <bool>true</bool>
-         </property>
-         <property name="minimum">
-          <number>-100</number>
-         </property>
-         <property name="maximum">
-          <number>100</number>
-         </property>
-         <property name="orientation">
-          <enum>Qt::Horizontal</enum>
-         </property>
-         <property name="tickPosition">
-          <enum>QSlider::TicksBelow</enum>
+       <item row="4" column="2">
+        <layout class="QHBoxLayout" name="horizontalLayout_4"/>
+       </item>
+       <item row="3" column="0" colspan="2">
+        <widget class="QLabel" name="label_2">
+         <property name="text">
+          <string>Control Mode</string>
          </property>
-         <property name="tickInterval">
-          <number>0</number>
+        </widget>
+       </item>
+       <item row="6" column="1">
+        <widget class="QLabel" name="labelUnit">
+         <property name="text">
+          <string/>
          </property>
         </widget>
        </item>
-       <item row="5" column="0">
+       <item row="6" column="0">
         <widget class="QLCDNumber" name="lcdNumberKinematicUnitJointValue">
          <property name="enabled">
           <bool>true</bool>
@@ -211,24 +210,32 @@
          </property>
         </widget>
        </item>
-       <item row="5" column="1">
-        <widget class="QLabel" name="labelUnit">
-         <property name="text">
-          <string/>
+       <item row="6" column="2">
+        <widget class="QSlider" name="horizontalSliderKinematicUnitPos">
+         <property name="enabled">
+          <bool>true</bool>
          </property>
-        </widget>
-       </item>
-       <item row="3" column="0" colspan="2">
-        <widget class="QLabel" name="label_2">
-         <property name="text">
-          <string>Control Mode</string>
+         <property name="minimum">
+          <number>-100</number>
+         </property>
+         <property name="maximum">
+          <number>100</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="tickPosition">
+          <enum>QSlider::TicksBelow</enum>
+         </property>
+         <property name="tickInterval">
+          <number>0</number>
          </property>
         </widget>
        </item>
-       <item row="2" column="0" colspan="2">
-        <widget class="QLabel" name="label">
+       <item row="6" column="3">
+        <widget class="QPushButton" name="copyToClipboard">
          <property name="text">
-          <string>Select Joint</string>
+          <string>Copy Values</string>
          </property>
         </widget>
        </item>
diff --git a/source/RobotAPI/gui-plugins/RobotViewerPlugin/RobotViewerGuiPlugin.cpp b/source/RobotAPI/gui-plugins/RobotViewerPlugin/RobotViewerGuiPlugin.cpp
index 764ff8214e825d22975f2a61274d4cbfa5c6e7f3..d7aa2b8c2c3b3955c0280b36d875cd3f891dee79 100644
--- a/source/RobotAPI/gui-plugins/RobotViewerPlugin/RobotViewerGuiPlugin.cpp
+++ b/source/RobotAPI/gui-plugins/RobotViewerPlugin/RobotViewerGuiPlugin.cpp
@@ -124,7 +124,7 @@ void RobotViewerWidgetController::onInitComponent()
     {
         std::string debugDrawerComponentName = "RobotViewerGUIDebugDrawer_" + getName();
         ARMARX_INFO << "Creating component " << debugDrawerComponentName;
-        debugDrawer = Component::create<DebugDrawerComponent>(properties, debugDrawerComponentName);
+        debugDrawer = Component::create<DebugDrawerComponent>(getIceProperties(), debugDrawerComponentName);
 
         if (mutex3D)
         {