diff --git a/emf_datamodel/model/iPos_Datamodel.aird b/emf_datamodel/model/iPos_Datamodel.aird
index 55362c17d0464878c33f2097976edbef106f5262..316130742973cb9cec583c8de700e73a2024fb63 100644
--- a/emf_datamodel/model/iPos_Datamodel.aird
+++ b/emf_datamodel/model/iPos_Datamodel.aird
@@ -5,7 +5,7 @@
     <semanticResources>iPos_Datamodel.genmodel</semanticResources>
     <ownedViews xmi:type="viewpoint:DView" uid="_EpwecAQNEey-kNQ7esRa_g">
       <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
-      <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_Et4wgAQNEey-kNQ7esRa_g" name="iPos_Datamodel" repPath="#_Es-xkAQNEey-kNQ7esRa_g" changeId="5569e7d7-fe6b-48dc-bf7a-f5d6518a0e6d">
+      <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_Et4wgAQNEey-kNQ7esRa_g" name="iPos_Datamodel" repPath="#_Es-xkAQNEey-kNQ7esRa_g" changeId="7b20d861-655d-4af4-b3fa-1e1f6d288005">
         <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
         <target xmi:type="ecore:EPackage" href="iPos_Datamodel.ecore#/"/>
       </ownedRepresentationDescriptors>
@@ -723,10 +723,6 @@
               <styles xmi:type="notation:FontStyle" xmi:id="_iWqJIR_NEeyaJIyxidrtuQ" fontColor="2697711" fontName="Segoe UI" fontHeight="8"/>
               <layoutConstraint xmi:type="notation:Location" xmi:id="_iWqJIh_NEeyaJIyxidrtuQ"/>
             </children>
-            <children xmi:type="notation:Node" xmi:id="_uoVVkCHPEeynrdmghnL28w" type="3010" element="_umtk8CHPEeynrdmghnL28w">
-              <styles xmi:type="notation:FontStyle" xmi:id="_uoVVkSHPEeynrdmghnL28w" fontColor="2697711" fontName="Segoe UI" fontHeight="8"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_uoVVkiHPEeynrdmghnL28w"/>
-            </children>
             <styles xmi:type="notation:SortingStyle" xmi:id="_D9ZrhQc-Eey-kNQ7esRa_g"/>
             <styles xmi:type="notation:FilteringStyle" xmi:id="_D9Zrhgc-Eey-kNQ7esRa_g"/>
           </children>
@@ -744,7 +740,7 @@
             <styles xmi:type="notation:FilteringStyle" xmi:id="_KI4fQhFjEeydeasO1RaQEg"/>
           </children>
           <styles xmi:type="notation:ShapeStyle" xmi:id="_KIxxkRFjEeydeasO1RaQEg" fontName="Segoe UI" fontHeight="8"/>
-          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KIxxkhFjEeydeasO1RaQEg" x="2165" y="751" width="140" height="50"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KIxxkhFjEeydeasO1RaQEg" x="2165" y="751" width="160" height="116"/>
         </children>
         <children xmi:type="notation:Node" xmi:id="_1eTRIBFjEeydeasO1RaQEg" type="2003" element="_1d2lMBFjEeydeasO1RaQEg">
           <children xmi:type="notation:Node" xmi:id="_1eTRIxFjEeydeasO1RaQEg" type="5007"/>
@@ -770,7 +766,7 @@
             <styles xmi:type="notation:FilteringStyle" xmi:id="_RzzHExFkEeydeasO1RaQEg"/>
           </children>
           <styles xmi:type="notation:ShapeStyle" xmi:id="_RzygARFkEeydeasO1RaQEg" fontName="Segoe UI" fontHeight="8"/>
-          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_RzygAhFkEeydeasO1RaQEg" x="2910" y="751" width="140" height="50"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_RzygAhFkEeydeasO1RaQEg" x="2910" y="751" width="171" height="104"/>
         </children>
         <children xmi:type="notation:Node" xmi:id="_bpQwUBFkEeydeasO1RaQEg" type="2003" element="_bo-ccBFkEeydeasO1RaQEg">
           <children xmi:type="notation:Node" xmi:id="_bpQwUxFkEeydeasO1RaQEg" type="5007"/>
@@ -818,6 +814,10 @@
         <children xmi:type="notation:Node" xmi:id="_ipaesCxSEeyc2bacnWuMrg" type="2003" element="_ipG8sCxSEeyc2bacnWuMrg">
           <children xmi:type="notation:Node" xmi:id="_ipbFwCxSEeyc2bacnWuMrg" type="5007"/>
           <children xmi:type="notation:Node" xmi:id="_ipbFwSxSEeyc2bacnWuMrg" type="7004">
+            <children xmi:type="notation:Node" xmi:id="_WEJAsDC6Eeys5_IXgF_hBA" type="3010" element="_WDgukDC6Eeys5_IXgF_hBA">
+              <styles xmi:type="notation:FontStyle" xmi:id="_WEJAsTC6Eeys5_IXgF_hBA" fontColor="2697711" fontName="Segoe UI" fontHeight="8"/>
+              <layoutConstraint xmi:type="notation:Location" xmi:id="_WEJAsjC6Eeys5_IXgF_hBA"/>
+            </children>
             <styles xmi:type="notation:SortingStyle" xmi:id="_ipbFwixSEeyc2bacnWuMrg"/>
             <styles xmi:type="notation:FilteringStyle" xmi:id="_ipbFwyxSEeyc2bacnWuMrg"/>
           </children>
@@ -2383,9 +2383,9 @@
         <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
       </ownedStyle>
       <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
-      <ownedElements xmi:type="diagram:DNodeListElement" uid="_J-iocBofEeymN8Dd3OTV4g" name="frameId : String" tooltipText="">
-        <target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//MonitoringRequest/frameId"/>
-        <semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//MonitoringRequest/frameId"/>
+      <ownedElements xmi:type="diagram:DNodeListElement" uid="_J-iocBofEeymN8Dd3OTV4g" name="frameIds : StringList" tooltipText="">
+        <target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//MonitoringRequest/frameIds"/>
+        <semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//MonitoringRequest/frameIds"/>
         <ownedStyle xmi:type="diagram:BundledImage" uid="_RXMRARofEeymN8Dd3OTV4g" labelAlignment="LEFT">
           <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
         </ownedStyle>
@@ -2896,7 +2896,7 @@
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
       <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
       <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
-      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_yc1iBSHPEeynrdmghnL28w" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
+      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_TIvV4jASEeys5_IXgF_hBA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
         <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
       </ownedStyle>
       <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
@@ -2956,10 +2956,10 @@
         </ownedStyle>
         <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
       </ownedElements>
-      <ownedElements xmi:type="diagram:DNodeListElement" uid="_1GZ5EBFkEeydeasO1RaQEg" name="positionConditionCell : FloatArray3d" tooltipText="">
-        <target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCell"/>
-        <semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCell"/>
-        <ownedStyle xmi:type="diagram:BundledImage" uid="_7MoQfhFkEeydeasO1RaQEg" labelAlignment="LEFT">
+      <ownedElements xmi:type="diagram:DNodeListElement" uid="_1GZ5EBFkEeydeasO1RaQEg" name="positionConditionCells : EMap" tooltipText="">
+        <target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCells"/>
+        <semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCells"/>
+        <ownedStyle xmi:type="diagram:BundledImage" uid="_TI5G5jASEeys5_IXgF_hBA" labelAlignment="LEFT">
           <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
         </ownedStyle>
         <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
@@ -2980,14 +2980,6 @@
         </ownedStyle>
         <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
       </ownedElements>
-      <ownedElements xmi:type="diagram:DNodeListElement" uid="_umtk8CHPEeynrdmghnL28w" name="positionConditionCellId : String" tooltipText="">
-        <target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCellId"/>
-        <semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCellId"/>
-        <ownedStyle xmi:type="diagram:BundledImage" uid="_yc8PpCHPEeynrdmghnL28w" labelAlignment="LEFT">
-          <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
-        </ownedStyle>
-        <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
-      </ownedElements>
     </ownedDiagramElements>
     <ownedDiagramElements xmi:type="diagram:DEdge" uid="_JkOxSgc-Eey-kNQ7esRa_g" name="[0..*] eventfiltercondition" sourceNode="_IOFwkAZtEey-kNQ7esRa_g" targetNode="_D9Ka8Ac-Eey-kNQ7esRa_g">
       <target xmi:type="ecore:EReference" href="iPos_Datamodel.ecore#//EventFilterConfiguration/eventfiltercondition"/>
@@ -3266,10 +3258,18 @@
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
       <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
       <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
-      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_ipHjwCxSEeyc2bacnWuMrg" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
+      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_XJ9ZRTC6Eeys5_IXgF_hBA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
         <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
       </ownedStyle>
       <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      <ownedElements xmi:type="diagram:DNodeListElement" uid="_WDgukDC6Eeys5_IXgF_hBA" name="trackingTaskId : String" tooltipText="">
+        <target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//DataStorageQueryResponse/trackingTaskId"/>
+        <semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//DataStorageQueryResponse/trackingTaskId"/>
+        <ownedStyle xmi:type="diagram:BundledImage" uid="_XKDf5DC6Eeys5_IXgF_hBA" labelAlignment="LEFT">
+          <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
+      </ownedElements>
     </ownedDiagramElements>
     <ownedDiagramElements xmi:type="diagram:DEdge" uid="_36hE0CxSEeyc2bacnWuMrg" name="[0..*] positionEvents" sourceNode="_ipG8sCxSEeyc2bacnWuMrg" targetNode="_lBuJcAZsEey-kNQ7esRa_g">
       <target xmi:type="ecore:EReference" href="iPos_Datamodel.ecore#//DataStorageQueryResponse/positionEvents"/>
diff --git a/emf_datamodel/model/iPos_Datamodel.ecore b/emf_datamodel/model/iPos_Datamodel.ecore
index a72eb3ba2732ca66e7fd3828b35e51b14bd4de98..c834487019636d3d3b5aaea94463fe7a3550d14b 100644
--- a/emf_datamodel/model/iPos_Datamodel.ecore
+++ b/emf_datamodel/model/iPos_Datamodel.ecore
@@ -130,7 +130,7 @@
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="TrackingRequest"/>
   <eClassifiers xsi:type="ecore:EClass" name="MonitoringRequest">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="frameId" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="frameIds" eType="#//StringList"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="delta" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="updateFrequency" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="#//StringList"/>
@@ -238,12 +238,15 @@
         transient="true"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="filterStructure" eType="#//BooleanList"
         transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="positionConditionCell"
-        eType="#//FloatArray3d"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="positionConditionCells"
+        transient="true">
+      <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+        <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
+        <eTypeArguments eClassifier="#//FloatArray3d"/>
+      </eGenericType>
+    </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="idCondition" eType="#//StringList"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="categoryCondition" eType="#//StringList"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="positionConditionCellId"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EDataType" name="StringList" instanceClassName="java.util.List&lt;java.lang.String>"/>
   <eClassifiers xsi:type="ecore:EDataType" name="StringArray" instanceClassName="java.util.ArrayList&lt;java.lang.String[]>"/>
@@ -257,5 +260,6 @@
   <eClassifiers xsi:type="ecore:EClass" name="DataStorageQueryResponse">
     <eStructuralFeatures xsi:type="ecore:EReference" name="positionEvents" upperBound="-1"
         eType="#//PositionEvent"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="trackingTaskId" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
   </eClassifiers>
 </ecore:EPackage>
diff --git a/emf_datamodel/model/iPos_Datamodel.genmodel b/emf_datamodel/model/iPos_Datamodel.genmodel
index 848cdc75b141b0a7f768b9122e8a03839d3ef357..1176dbeb40201997d86b0dfdb13c5472df367bd4 100644
--- a/emf_datamodel/model/iPos_Datamodel.genmodel
+++ b/emf_datamodel/model/iPos_Datamodel.genmodel
@@ -120,7 +120,7 @@
     </genClasses>
     <genClasses ecoreClass="iPos_Datamodel.ecore#//TrackingRequest"/>
     <genClasses ecoreClass="iPos_Datamodel.ecore#//MonitoringRequest">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//MonitoringRequest/frameId"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//MonitoringRequest/frameIds"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//MonitoringRequest/delta"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//MonitoringRequest/updateFrequency"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//MonitoringRequest/type"/>
@@ -183,10 +183,9 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/positionDelta"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/sensorIdCondition"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/filterStructure"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCell"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCells"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/idCondition"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/categoryCondition"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCellId"/>
     </genClasses>
     <genClasses ecoreClass="iPos_Datamodel.ecore#//ZoneDescriptor">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//ZoneDescriptor/zoneId"/>
@@ -194,6 +193,7 @@
     </genClasses>
     <genClasses ecoreClass="iPos_Datamodel.ecore#//DataStorageQueryResponse">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iPos_Datamodel.ecore#//DataStorageQueryResponse/positionEvents"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//DataStorageQueryResponse/trackingTaskId"/>
     </genClasses>
   </genPackages>
 </genmodel:GenModel>
diff --git a/init_Industrierobotik.txt b/init_Industrierobotik.txt
index 7dee9f96e547d9983e36b50b7a8d37e69eeb3bd7..84a0f0e71754bc39bd2b05a46d048eb120d38eea 100644
--- a/init_Industrierobotik.txt
+++ b/init_Industrierobotik.txt
@@ -1,5 +1,5 @@
-{"frames": [{"id": "cobot1_door_zone", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 2.0,"y": 0.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 4.0, "y": 4.0, "z":6.0}]}, {"id": "cobot1_window_zone", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 2.0,"y": 4.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 4.0, "y": 4.0, "z":6.0}]} ]}
+{"frames": [{"id": "cobot1_door_zone", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 2.0,"y": 0.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 4.0, "y": 4.0, "z":6.0}]}, {"id": "cobot1_window_zone", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 2.0,"y": 4.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 4.0, "y": 4.0, "z":6.0}]}, {"id": "robolab_east", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 4.0,"y": 2.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 8.0, "y": 10.0, "z":6.0}]}, {"id": "robolab_west", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": -4.0,"y": 2.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 8.0, "y": 10.0, "z":6.0}]} ]}
 {"refSystems": [{"id": "ROOT"}, {"id": "CETI_ROOT", "position": {"refSystemId": "ROOT", "point": {"x": 3.05,"y": 2.08,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0}}]}
-{"objectConfigs": [{"agentId": "Employee1", "sensorId": "UWB_1", "agentType": "HUMAN", "sensorType": "UWB"}, {"agentId": "Employee2", "sensorId": "UWB_2", "agentType": "HUMAN", "sensorType": "UWB"}, {"agentId": "Turtlebot", "sensorId": "98:CD:AC:26:2D:18", "agentType": "ROBOT", "sensorType": "RFID_SCANNER"}]}
+{"objectConfigs": [{"agentId": "turtlebot", "sensorId": "UWB_1", "agentType": "ROBOT", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "UWB_2", "agentType": "ROBOT", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "98:CD:AC:26:2D:18", "agentType": "ROBOT", "sensorType": "RFID_SCANNER"}]}
 {"pois": [{"id": "UWB_BEACON_1", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 3.1,"y": 0.5,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "UWB_BEACON_2", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": -0.3,"y": 4.5,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0}}, {"id": "83221710", "description": "RFID_TAG", "data": {"type" : "NFC"}, "position": {"refSystemId": "ROOT", "point": {"x": 2.1,"y": 0.4,"z": 0.5}, "accuracy": 0.1}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "31762128", "description": "RFID_TAG", "data": {"type" : "NFC"}, "position": {"refSystemId": "ROOT", "point": {"x": 2.2,"y": 3.4,"z": 0.5}, "accuracy": 0.1}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }]}
-{"monitoringRequests": [{"frameId": "cobot1_door_zone", "monitoringTaskId": "Human_at_Door_Side", "serializationType": "protobuf"}, {"frameId": "cobot1_window_zone", "monitoringTaskId": "Human_at_Window_Side", "serializationType": "protobuf"}]}
\ No newline at end of file
+{"monitoringRequests": [{"frameIds": ["cobot1_door_zone", "cobot1_window_zone"], "monitoringTaskId": "RobolabMonitoringCeti", "serializationType": "protobuf"}, {"frameIds": ["cobot1_door_zone", "cobot1_window_zone", "robolab_east", "robolab_west"], "monitoringTaskId": "RobolabMonitoringFrontend", "serializationType": "json"}]}
\ No newline at end of file
diff --git a/init_Sensordatenfusion.txt b/init_Sensordatenfusion.txt
index 889f82a0f9b15b738bcaacc88a23ccab33059bfa..12a97a98e641d6a4759b957df7892d8819a1e193 100644
--- a/init_Sensordatenfusion.txt
+++ b/init_Sensordatenfusion.txt
@@ -2,4 +2,4 @@
 {"refSystems": [{"id": "ROOT"}]}
 {"objectConfigs": [{"agentId": "turtlebot", "sensorId": "UWB_1", "agentType": "HUMAN", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "98:CD:AC:26:2D:18", "agentType": "ROBOT", "sensorType": "RFID_SCANNER"}]}
 {"pois": [{"id": "83221710", "description": "RFID_TAG", "data": {"type" : "NFC"}, "position": {"refSystemId": "ROOT", "point": {"x": 2.1,"y": 0.4,"z": 0.5}, "accuracy": 0.1}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "31762128", "description": "RFID_TAG", "data": {"type" : "NFC"}, "position": {"refSystemId": "ROOT", "point": {"x": 2.2,"y": 3.4,"z": 0.5}, "accuracy": 0.1}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }]}
-{"monitoringRequests": [{"frameId": "robolab", "monitoringTaskId": "robolab_topic", "serializationType": "json"}]}
\ No newline at end of file
+{"monitoringRequests": [{"frameId": "robolab", "monitoringTaskId": "ipos/client/position", "serializationType": "json"}]}
\ No newline at end of file
diff --git a/src/main/java/ipos/project/CustomLoggingFilter.java b/src/main/java/ipos/project/CustomLoggingFilter.java
index 483fcfd3eea85d66d6df2c19ccfd309165407d2a..826a31fc8bb5cefc9967011f5a85637f760a9070 100644
--- a/src/main/java/ipos/project/CustomLoggingFilter.java
+++ b/src/main/java/ipos/project/CustomLoggingFilter.java
@@ -11,8 +11,12 @@ public class CustomLoggingFilter extends Filter<ILoggingEvent> {
         if (event.getMessage().contains("Eventfilter:")) {
             return FilterReply.DENY;
         } else if (event.getMessage().contains("SDF:")) {
-            return FilterReply.ACCEPT;
-        }else {
+            return FilterReply.DENY;
+        } else if (event.getMessage().contains("INDFRO:")){
+           return FilterReply.ACCEPT;
+        } else if (event.getMessage().contains("INDFRO-DEBUG:")){
+            return FilterReply.DENY;
+        } else {
             return FilterReply.DENY;
         }
 
diff --git a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/SimpleSceneIntegration.java b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/SimpleSceneIntegration.java
index 113ed3cca299106babb7c17c83cdd40d2f396169..2246adc6dcd1566a6175f9de6d14b23dda7789b4 100644
--- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/SimpleSceneIntegration.java
+++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/SimpleSceneIntegration.java
@@ -6,11 +6,14 @@ import ipos.project.DataModellntegration.SimpleSceneIntegration.api.MqttRequestH
 import ipos.project.DataModellntegration.SimpleSceneIntegration.service.SimpleSceneTransformer;
 import ipos.project.DataModellntegration.SimpleSceneIntegration.service.impl.ExternalPubServiceImpl;
 import ipos.project.DataModellntegration.iPos_Datamodel.DataStorageQueryResponse;
+import ipos.project.DataModellntegration.iPos_Datamodel.Point3D;
 import ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent;
+import ipos.project.DataModellntegration.iPos_Datamodel.ZoneDescriptor;
 import ipos.project.UseCaseController.Administration;
 import ipos.project.UseCaseController.PositionMonitoring;
 import ipos.project.mapper.ProtoJsonMap;
 import org.apache.logging.log4j.LogManager;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.paho.client.mqttv3.MqttMessage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -36,7 +39,11 @@ public class SimpleSceneIntegration {
 
     public static void init(String path_to_init_data_file){
         Administration.initialize(); // clears WorldModel
-        File initFile = new File(path_to_init_data_file);
+        handleMessageFile(path_to_init_data_file);
+    }
+
+    public static void handleMessageFile(String path_to_message_file) {
+        File initFile = new File(path_to_message_file);
         try {
             for (String line : readLines(initFile)) {
                 SimpleScene.IposConfigWrapper iposConfigWrapper = ProtoJsonMap.fromJson(line, SimpleScene.IposConfigWrapper.class);
@@ -82,36 +89,67 @@ public class SimpleSceneIntegration {
         }
     }*/
 
-    public static void receiveMessage(DataStorageQueryResponse dsQueryResponse, String trackingTaskId){
-        // TODO (tracking): implement function receiveMessage(DataStorageQueryResponse dsQueryResponse, String trackingTaskId)
-        // serialization type wird noch benötigt
+    public static void receiveMessage(DataStorageQueryResponse dsQueryResponse, String trackingTaskId, String serializationType){
+        SimpleScene.IposQueryResponse queryResponse_proto = SimpleSceneTransformer.queryResp_Internal2SScene(dsQueryResponse, trackingTaskId);
+        MqttMessage mqttMessage = mqttService.createMqttMsg(queryResponse_proto, 0, false);
+        LOG.info("INDFRO: Publishing DataStorageQueryResponse on topic " + trackingTaskId + ": " + ProtoJsonMap.toJson(queryResponse_proto) + "; serializationType: " + serializationType);
+        publishRespectingSerializationType(trackingTaskId, serializationType, ProtoJsonMap.toJson(queryResponse_proto), mqttMessage);
     }
 
     public static void receiveMessage(PositionEvent positionEvent, String monitoringTaskId, String notificationType, String serializationType) {
         //String jsonPos = ProtoJsonMap.toJson(positionEvent); // we can translate a class into a string using several methods: 1) `.toString()` 2) `JsonFormat` in `ProtoJsonMap`
         if (positionEvent != null) {
-            // TODO (Tracking): The following transformer-call has to copy the zoneDescriptors of PositionEvent into the IposPositionEvent
-            SimpleScene.IposPositionEvent posEvent_proto = SimpleSceneTransformer.posEvent_internal2Proto(positionEvent, notificationType);
+
+            // verwenden: DataServices.create-Methoden verwenden. Für ZoneDeskriptoren neue create-Funktionen schreiben
+            // PositionEvent posEvent_copy = duplicatePositionEvent(positionEvent);
+            SimpleScene.IposPositionEvent posEvent_proto = SimpleSceneTransformer.posEvent_internal2Proto(scale_position_frontend_app(positionEvent, 15), notificationType);
             MqttMessage mqttMessage = mqttService.createMqttMsg(posEvent_proto, 0, false);
             logging_sdf(monitoringTaskId, serializationType, posEvent_proto);
+            logging_indfro(positionEvent, monitoringTaskId, serializationType);
 
-            // publishes protobuf over MQTT
-            if (PositionMonitoring.PROTOBUF_SERIALIZATION_TYPE.equals(serializationType)){
-                mqttService.publish(monitoringTaskId, mqttMessage);
-                LOG.info("publishing protobuf mqttMessage. JSON-representation:" + ProtoJsonMap.toJson(posEvent_proto) + " on topic: " + monitoringTaskId);
-            }
-
-            // publishes JSON over MQTT
-            if (PositionMonitoring.JSON_SERIALIZATION_TYPE.equals(serializationType)){
-                mqttService.publish(monitoringTaskId, ProtoJsonMap.toJson(posEvent_proto), 0, false);
-                LOG.info("publishing JSON mqttMessage:" + ProtoJsonMap.toJson(posEvent_proto) + " on topic: " + monitoringTaskId);
-            }
+            publishRespectingSerializationType(monitoringTaskId, serializationType, ProtoJsonMap.toJson(posEvent_proto), mqttMessage);
 
         }else{
             LOG.warn("Warning: SimpleScene: Received empty PositionEvent");
         }
     }
 
+    private static void logging_indfro(PositionEvent positionEvent, String monitoringTaskId, String serializationType) {
+        LOG.info("INDFRO: Publishing PositionEvent on topic " + monitoringTaskId + ": ZoneDescriptors:" + logZoneDescr(positionEvent.getZonedescriptors()) + "; serializationType: " + serializationType);
+    }
+
+    private static String logZoneDescr(EList<ZoneDescriptor> zonedescriptors) {
+        String logString = "";
+        for (ZoneDescriptor zoneDescriptor : zonedescriptors){
+            logString += "zoneId: " + zoneDescriptor.getZoneId() + "; ";
+            logString += "notificationType: " + zoneDescriptor.getNotificationType() + "    ";
+        }
+        logString += "_______";
+        return logString;
+    }
+
+    private static void publishRespectingSerializationType(String topic, String serializationType, String jsonString, MqttMessage mqttMessage) {
+        // publishes protobuf over MQTT
+        if (PositionMonitoring.PROTOBUF_SERIALIZATION_TYPE.equals(serializationType)){
+            mqttService.publish(topic, mqttMessage);
+            LOG.info("publishing protobuf mqttMessage. JSON-representation:" + jsonString + " on topic: " + topic);
+        }
+
+        // publishes JSON over MQTT
+        if (PositionMonitoring.JSON_SERIALIZATION_TYPE.equals(serializationType)){
+            mqttService.publish(topic, jsonString, 0, false);
+            LOG.info("publishing JSON mqttMessage:" + jsonString + " on topic: " + topic);
+        }
+    }
+
+    private static PositionEvent scale_position_frontend_app(PositionEvent internalPositionEvent, int factor) {
+        Point3D point = (Point3D) internalPositionEvent.getPlacing().getPosition().getPoint();
+        point.setX(factor*point.getX());
+        point.setY(factor*point.getY());
+        point.setZ(factor*point.getZ());
+        return internalPositionEvent;
+    }
+
     private static void logging_sdf(String monitoringTaskId, String serializationType, SimpleScene.IposPositionEvent posEvent_proto) {
         for (SimpleScene.IposObject obj : posEvent_proto.getObjectList()){
             String agentId = obj.getId();
@@ -119,7 +157,7 @@ public class SimpleSceneIntegration {
             String sensorType = obj.getSensorType();
             String timestamp = obj.getLastPosUpdate();
             String topic = monitoringTaskId;
-            LOG.info("SDF: Publishing: sensorType: " + sensorType + " timestamp: " + timestamp + " sensorId: " + sensorId + " agentId: " + agentId + " serializationType: " + serializationType);
+            LOG.info("SDF: Publishing: sensorType: " + sensorType + "; timestamp: " + timestamp + "; sensorId: " + sensorId + "; agentId: " + agentId + "; topic: " + monitoringTaskId + "; serializationType: " + serializationType);
             LOG.info("SDF: ");
             LOG.info("SDF: ");
             LOG.info("SDF: ");
diff --git a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/api/MqttRequestHandler.java b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/api/MqttRequestHandler.java
index 77879d8e1ba46b12e198ecc964e3b6bf8366d644..ab246f46386b5e79de2515e0ecf1b97dbcfab871 100644
--- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/api/MqttRequestHandler.java
+++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/api/MqttRequestHandler.java
@@ -51,11 +51,20 @@ public class MqttRequestHandler implements Handler {
         processFrameConfigs(iposConfigWrapper.getFramesList()); // should be done not before refSystem-processing, as it might require one of the processed refSystems
         processObjectConfigs(iposConfigWrapper.getObjectConfigsList());
         processPois(iposConfigWrapper.getPoisList());
-        // TODO (tracking): processQueryRequest has to be implemented
+        processQueryRequest(iposConfigWrapper.getQueryRequestsList());
 
         // this.jmsTemplate.convertAndSend("/request123", monReqInternal); // submit request to the internal broker
     }
 
+    private static void processQueryRequest(List<SimpleScene.IposQueryRequest> queryRequestsList) {
+        for (SimpleScene.IposQueryRequest proto_qReq : queryRequestsList){
+            DataStorageQueryRequest internal_qReq = SimpleSceneTransformer.queryReq_SScene2Internal(proto_qReq);
+            LOG.info("INDFRO:");
+            LOG.info("INDFRO: Received QueryRequest for trackingTaskId " + internal_qReq.getTrackingTaskId());
+            PositionMonitoring.receiveMessage(internal_qReq);
+        }
+    }
+
     /*
     private SimpleScene.IposConfigWrapper replaceNullByEmptyList(SimpleScene.IposConfigWrapper configWrapper) {
         SimpleScene.IposConfigWrapper.Builder configWrapper_NoNull = SimpleScene.IposConfigWrapper.newBuilder();
diff --git a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java
index 28a37a3748ba9a9151c16d0b453402a59c816751..9454e3304bda9a133ccc0f0a04f1e7a2dba31f23 100644
--- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java
+++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java
@@ -5,8 +5,10 @@ import ipos.project.DataModellntegration.iPos_Datamodel.*;
 import com.google.protobuf.ProtocolStringList;
 import ipos.project.UseCaseController.PositionMonitoring;
 import org.apache.logging.log4j.LogManager;
+import org.eclipse.emf.common.util.EList;
 
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 
 public class SimpleSceneTransformer {
@@ -15,7 +17,8 @@ public class SimpleSceneTransformer {
 
     public static MonitoringRequest monReq_SScene2Internal(SimpleScene.IposMonitoringRequest monReqProto){
         MonitoringRequest monReqInt = modelFactory.createMonitoringRequest();
-        monReqInt.setFrameId(monReqProto.getFrameId());
+        monReqInt.setFrameIds(new LinkedList<>());
+        monReqInt.getFrameIds().addAll(monReqProto.getFrameIdsList());
         monReqInt.setDelta(monReqProto.getDelta());
         monReqInt.setUpdateFrequency(monReqProto.getUpdateFrequency());
         monReqInt.setType(toJavaStringList(monReqProto.getTypeList()));
@@ -42,6 +45,13 @@ public class SimpleSceneTransformer {
     }
 
     public static SimpleScene.IposPositionEvent posEvent_internal2Proto(PositionEvent internalPosEvent, String notificationType){
+        SimpleScene.IposObject.Builder protoIposObject = constructProtoIposObjectFromPosEvent(internalPosEvent);
+        if (protoIposObject == null) return null;
+        SimpleScene.IposPositionEvent.Builder protoIposPosEvent = transformIntoProtoIposPosEvent(notificationType, protoIposObject);
+        return protoIposPosEvent.build();
+    }
+
+    private static SimpleScene.IposObject.Builder constructProtoIposObjectFromPosEvent(PositionEvent internalPosEvent) {
         LocalizableObject lObject = PositionMonitoring.getLObjectByIdOrNull(internalPosEvent.getLObjectId());
         if (null == lObject || null == lObject.getAgent()) {
             LOG.error("Internal-PositionEvent could not be transformed into protobuf-format. " +
@@ -52,9 +62,20 @@ public class SimpleSceneTransformer {
         SimpleScene.IposPoint3D.Builder protoPoint3D = transformIntoProtoPoint3D(internalPosEvent);
         SimpleScene.IposPosition.Builder protoIposPosition = transformIntoProtoIposPosition(internalPosEvent, protoPoint3D);
         SimpleScene.IposSimpleOrientation.Builder protoOrientation = transformIntoProtoOrientation(internalPosEvent);
-        SimpleScene.IposObject.Builder protoIposObject = transformIntoProtoObject(internalPosEvent, lObject, protoIposPosition, protoOrientation);
-        SimpleScene.IposPositionEvent.Builder protoIposPosEvent = transformIntoProtoIposPosEvent(notificationType, protoIposObject);
-        return protoIposPosEvent.build();
+        List<SimpleScene.IposZoneDescriptor.Builder> zoneDescriptors = transformIntoProtoZoneDescriptorList(internalPosEvent);
+        SimpleScene.IposObject.Builder protoIposObject = transformIntoProtoObject(internalPosEvent, lObject, protoIposPosition, protoOrientation, zoneDescriptors);
+        return protoIposObject;
+    }
+
+    private static List<SimpleScene.IposZoneDescriptor.Builder> transformIntoProtoZoneDescriptorList(PositionEvent internalPosEvent) {
+        List<SimpleScene.IposZoneDescriptor.Builder> zoneDescriptorList = new LinkedList<>();
+        for ( ZoneDescriptor zoneDescriptor_internal : internalPosEvent.getZonedescriptors()){
+            SimpleScene.IposZoneDescriptor.Builder protoIposZoneDescriptor = SimpleScene.IposZoneDescriptor.newBuilder();
+            protoIposZoneDescriptor.setZoneId(zoneDescriptor_internal.getZoneId());
+            protoIposZoneDescriptor.setNotificationType(zoneDescriptor_internal.getNotificationType());
+            zoneDescriptorList.add(protoIposZoneDescriptor);
+        }
+        return zoneDescriptorList;
     }
 
     private static SimpleScene.IposPositionEvent.Builder transformIntoProtoIposPosEvent(String notificationType, SimpleScene.IposObject.Builder protoIposObject) {
@@ -66,9 +87,12 @@ public class SimpleSceneTransformer {
         return protoIposPosEvent;
     }
 
-    private static SimpleScene.IposObject.Builder transformIntoProtoObject(PositionEvent internalPosEvent, LocalizableObject lObject, SimpleScene.IposPosition.Builder protoIposPosition, SimpleScene.IposSimpleOrientation.Builder protoOrientation) {
+    private static SimpleScene.IposObject.Builder transformIntoProtoObject(PositionEvent internalPosEvent, LocalizableObject lObject, SimpleScene.IposPosition.Builder protoIposPosition, SimpleScene.IposSimpleOrientation.Builder protoOrientation, List<SimpleScene.IposZoneDescriptor.Builder> zoneDescriptors) {
         SimpleScene.IposObject.Builder protoIposObject = SimpleScene.IposObject.newBuilder();
         protoIposObject.setSensorId(lObject.getId()).setSensorType(lObject.getSensorType()).setId(lObject.getAgent().getId()).setType(lObject.getAgent().getAgentType()).setOrientation(protoOrientation).setPosition(protoIposPosition).setLastPosUpdate(internalPosEvent.getTimeStamp());
+        for (SimpleScene.IposZoneDescriptor.Builder zoneDescriptor : zoneDescriptors){
+            protoIposObject.addZoneDescriptors(zoneDescriptor); //   getZoneDescriptorsBuilderList().addAll(zoneDescriptors);
+        }
         return protoIposObject;
     }
 
@@ -189,4 +213,31 @@ public class SimpleSceneTransformer {
         poi.setPlacing(placing_SScene2Internal(poi_proto.getPosition(), poi_proto.getOrientation()));
         return poi;
     }
+
+    public static DataStorageQueryRequest queryReq_SScene2Internal(SimpleScene.IposQueryRequest proto_qReq) {
+        DataStorageQueryRequest internal_queryReq = modelFactory.createDataStorageQueryRequest();
+        internal_queryReq.setTrackingTaskId(proto_qReq.getTrackingTaskId());
+        return internal_queryReq;
+    }
+
+    public static SimpleScene.IposQueryResponse queryResp_Internal2SScene(DataStorageQueryResponse dsQueryResponse, String trackingTaskId) {
+        SimpleScene.IposQueryResponse.Builder iposQueryResponse = SimpleScene.IposQueryResponse.newBuilder();
+        iposQueryResponse.setTrackingTaskId(dsQueryResponse.getTrackingTaskId());
+        List<SimpleScene.IposObject.Builder> iposObjects = transformIntoProtoObjectList(dsQueryResponse.getPositionEvents());
+        for ( SimpleScene.IposObject.Builder iposObject : iposObjects){
+            iposQueryResponse.addObjects(iposObject);
+        }
+        return iposQueryResponse.build();
+
+    }
+
+    private static List<SimpleScene.IposObject.Builder> transformIntoProtoObjectList(EList<PositionEvent> positionEvents) {
+        List<SimpleScene.IposObject.Builder> iposObjectList = new LinkedList<>();
+        for (PositionEvent posEvent : positionEvents){
+            SimpleScene.IposObject.Builder protoIposObject = constructProtoIposObjectFromPosEvent(posEvent);
+            if (protoIposObject == null) continue;
+            iposObjectList.add(protoIposObject);
+        }
+        return iposObjectList;
+    }
 }
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/DataStorageQueryResponse.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/DataStorageQueryResponse.java
index d917237958783d822c56a62c7f8740d10228cfad..f2adfc0843c4444f89b92fb5a0ceb4994b7343df 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/DataStorageQueryResponse.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/DataStorageQueryResponse.java
@@ -16,6 +16,7 @@ import org.eclipse.emf.ecore.EObject;
  * </p>
  * <ul>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.DataStorageQueryResponse#getPositionEvents <em>Position Events</em>}</li>
+ *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.DataStorageQueryResponse#getTrackingTaskId <em>Tracking Task Id</em>}</li>
  * </ul>
  *
  * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getDataStorageQueryResponse()
@@ -35,4 +36,26 @@ public interface DataStorageQueryResponse extends EObject {
 	 */
 	EList<PositionEvent> getPositionEvents();
 
+	/**
+	 * Returns the value of the '<em><b>Tracking Task Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Tracking Task Id</em>' attribute.
+	 * @see #setTrackingTaskId(String)
+	 * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getDataStorageQueryResponse_TrackingTaskId()
+	 * @model dataType="org.eclipse.emf.ecore.xml.type.String"
+	 * @generated
+	 */
+	String getTrackingTaskId();
+
+	/**
+	 * Sets the value of the '{@link ipos.project.DataModellntegration.iPos_Datamodel.DataStorageQueryResponse#getTrackingTaskId <em>Tracking Task Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Tracking Task Id</em>' attribute.
+	 * @see #getTrackingTaskId()
+	 * @generated
+	 */
+	void setTrackingTaskId(String value);
+
 } // DataStorageQueryResponse
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java
index 46e45613301030759a01d78e3f3c833a210b1422..7785da018e6c69997787db9a419dc74a68a4b930 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java
@@ -5,6 +5,7 @@ package ipos.project.DataModellntegration.iPos_Datamodel;
 import java.util.ArrayList;
 import java.util.List;
 
+import java.util.Map;
 import org.eclipse.emf.ecore.EObject;
 
 /**
@@ -23,10 +24,9 @@ import org.eclipse.emf.ecore.EObject;
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionDelta <em>Position Delta</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getSensorIdCondition <em>Sensor Id Condition</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getFilterStructure <em>Filter Structure</em>}</li>
- *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCell <em>Position Condition Cell</em>}</li>
+ *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCells <em>Position Condition Cells</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getIdCondition <em>Id Condition</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getCategoryCondition <em>Category Condition</em>}</li>
- *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCellId <em>Position Condition Cell Id</em>}</li>
  * </ul>
  *
  * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getEventFilterCondition()
@@ -189,26 +189,26 @@ public interface EventFilterCondition extends EObject {
 	void setFilterStructure(boolean[] value);
 
 	/**
-	 * Returns the value of the '<em><b>Position Condition Cell</b></em>' attribute.
+	 * Returns the value of the '<em><b>Position Condition Cells</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Position Condition Cell</em>' attribute.
-	 * @see #setPositionConditionCell(ArrayList)
-	 * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getEventFilterCondition_PositionConditionCell()
-	 * @model dataType="ipos.project.DataModellntegration.iPos_Datamodel.FloatArray3d"
+	 * @return the value of the '<em>Position Condition Cells</em>' attribute.
+	 * @see #setPositionConditionCells(Map)
+	 * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getEventFilterCondition_PositionConditionCells()
+	 * @model transient="true"
 	 * @generated
 	 */
-	ArrayList<Float[][]> getPositionConditionCell();
+	Map<String, ArrayList<Float[][]>> getPositionConditionCells();
 
 	/**
-	 * Sets the value of the '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCell <em>Position Condition Cell</em>}' attribute.
+	 * Sets the value of the '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCells <em>Position Condition Cells</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Position Condition Cell</em>' attribute.
-	 * @see #getPositionConditionCell()
+	 * @param value the new value of the '<em>Position Condition Cells</em>' attribute.
+	 * @see #getPositionConditionCells()
 	 * @generated
 	 */
-	void setPositionConditionCell(ArrayList<Float[][]> value);
+	void setPositionConditionCells(Map<String, ArrayList<Float[][]>> value);
 
 	/**
 	 * Returns the value of the '<em><b>Id Condition</b></em>' attribute.
@@ -254,26 +254,4 @@ public interface EventFilterCondition extends EObject {
 	 */
 	void setCategoryCondition(List<String> value);
 
-	/**
-	 * Returns the value of the '<em><b>Position Condition Cell Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Position Condition Cell Id</em>' attribute.
-	 * @see #setPositionConditionCellId(String)
-	 * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getEventFilterCondition_PositionConditionCellId()
-	 * @model dataType="org.eclipse.emf.ecore.xml.type.String"
-	 * @generated
-	 */
-	String getPositionConditionCellId();
-
-	/**
-	 * Sets the value of the '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCellId <em>Position Condition Cell Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Position Condition Cell Id</em>' attribute.
-	 * @see #getPositionConditionCellId()
-	 * @generated
-	 */
-	void setPositionConditionCellId(String value);
-
 } // EventFilterCondition
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java
index 53140b07ab1fd8bfc2885eb35758d088847b4a1e..81553df565c81b4b2dba729d1450d7d642f2d0df 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java
@@ -1437,13 +1437,13 @@ public interface IPos_DatamodelPackage extends EPackage {
 	int MONITORING_REQUEST = 27;
 
 	/**
-	 * The feature id for the '<em><b>Frame Id</b></em>' attribute.
+	 * The feature id for the '<em><b>Frame Ids</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int MONITORING_REQUEST__FRAME_ID = 0;
+	int MONITORING_REQUEST__FRAME_IDS = 0;
 
 	/**
 	 * The feature id for the '<em><b>Delta</b></em>' attribute.
@@ -2417,13 +2417,13 @@ public interface IPos_DatamodelPackage extends EPackage {
 	int EVENT_FILTER_CONDITION__FILTER_STRUCTURE = 6;
 
 	/**
-	 * The feature id for the '<em><b>Position Condition Cell</b></em>' attribute.
+	 * The feature id for the '<em><b>Position Condition Cells</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL = 7;
+	int EVENT_FILTER_CONDITION__POSITION_CONDITION_CELLS = 7;
 
 	/**
 	 * The feature id for the '<em><b>Id Condition</b></em>' attribute.
@@ -2443,15 +2443,6 @@ public interface IPos_DatamodelPackage extends EPackage {
 	 */
 	int EVENT_FILTER_CONDITION__CATEGORY_CONDITION = 9;
 
-	/**
-	 * The feature id for the '<em><b>Position Condition Cell Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL_ID = 10;
-
 	/**
 	 * The number of structural features of the '<em>Event Filter Condition</em>' class.
 	 * <!-- begin-user-doc -->
@@ -2459,7 +2450,7 @@ public interface IPos_DatamodelPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int EVENT_FILTER_CONDITION_FEATURE_COUNT = 11;
+	int EVENT_FILTER_CONDITION_FEATURE_COUNT = 10;
 
 	/**
 	 * The number of operations of the '<em>Event Filter Condition</em>' class.
@@ -2535,6 +2526,15 @@ public interface IPos_DatamodelPackage extends EPackage {
 	 */
 	int DATA_STORAGE_QUERY_RESPONSE__POSITION_EVENTS = 0;
 
+	/**
+	 * The feature id for the '<em><b>Tracking Task Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STORAGE_QUERY_RESPONSE__TRACKING_TASK_ID = 1;
+
 	/**
 	 * The number of structural features of the '<em>Data Storage Query Response</em>' class.
 	 * <!-- begin-user-doc -->
@@ -2542,7 +2542,7 @@ public interface IPos_DatamodelPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_STORAGE_QUERY_RESPONSE_FEATURE_COUNT = 1;
+	int DATA_STORAGE_QUERY_RESPONSE_FEATURE_COUNT = 2;
 
 	/**
 	 * The number of operations of the '<em>Data Storage Query Response</em>' class.
@@ -3485,15 +3485,15 @@ public interface IPos_DatamodelPackage extends EPackage {
 	EClass getMonitoringRequest();
 
 	/**
-	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getFrameId <em>Frame Id</em>}'.
+	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getFrameIds <em>Frame Ids</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Frame Id</em>'.
-	 * @see ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getFrameId()
+	 * @return the meta object for the attribute '<em>Frame Ids</em>'.
+	 * @see ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getFrameIds()
 	 * @see #getMonitoringRequest()
 	 * @generated
 	 */
-	EAttribute getMonitoringRequest_FrameId();
+	EAttribute getMonitoringRequest_FrameIds();
 
 	/**
 	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getDelta <em>Delta</em>}'.
@@ -4051,15 +4051,15 @@ public interface IPos_DatamodelPackage extends EPackage {
 	EAttribute getEventFilterCondition_FilterStructure();
 
 	/**
-	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCell <em>Position Condition Cell</em>}'.
+	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCells <em>Position Condition Cells</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Position Condition Cell</em>'.
-	 * @see ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCell()
+	 * @return the meta object for the attribute '<em>Position Condition Cells</em>'.
+	 * @see ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCells()
 	 * @see #getEventFilterCondition()
 	 * @generated
 	 */
-	EAttribute getEventFilterCondition_PositionConditionCell();
+	EAttribute getEventFilterCondition_PositionConditionCells();
 
 	/**
 	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getIdCondition <em>Id Condition</em>}'.
@@ -4083,17 +4083,6 @@ public interface IPos_DatamodelPackage extends EPackage {
 	 */
 	EAttribute getEventFilterCondition_CategoryCondition();
 
-	/**
-	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCellId <em>Position Condition Cell Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Position Condition Cell Id</em>'.
-	 * @see ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCellId()
-	 * @see #getEventFilterCondition()
-	 * @generated
-	 */
-	EAttribute getEventFilterCondition_PositionConditionCellId();
-
 	/**
 	 * Returns the meta object for class '{@link ipos.project.DataModellntegration.iPos_Datamodel.ZoneDescriptor <em>Zone Descriptor</em>}'.
 	 * <!-- begin-user-doc -->
@@ -4147,6 +4136,17 @@ public interface IPos_DatamodelPackage extends EPackage {
 	 */
 	EReference getDataStorageQueryResponse_PositionEvents();
 
+	/**
+	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.DataStorageQueryResponse#getTrackingTaskId <em>Tracking Task Id</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Tracking Task Id</em>'.
+	 * @see ipos.project.DataModellntegration.iPos_Datamodel.DataStorageQueryResponse#getTrackingTaskId()
+	 * @see #getDataStorageQueryResponse()
+	 * @generated
+	 */
+	EAttribute getDataStorageQueryResponse_TrackingTaskId();
+
 	/**
 	 * Returns the meta object for data type '{@link java.util.List <em>String List</em>}'.
 	 * <!-- begin-user-doc -->
@@ -4942,12 +4942,12 @@ public interface IPos_DatamodelPackage extends EPackage {
 		EClass MONITORING_REQUEST = eINSTANCE.getMonitoringRequest();
 
 		/**
-		 * The meta object literal for the '<em><b>Frame Id</b></em>' attribute feature.
+		 * The meta object literal for the '<em><b>Frame Ids</b></em>' attribute feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EAttribute MONITORING_REQUEST__FRAME_ID = eINSTANCE.getMonitoringRequest_FrameId();
+		EAttribute MONITORING_REQUEST__FRAME_IDS = eINSTANCE.getMonitoringRequest_FrameIds();
 
 		/**
 		 * The meta object literal for the '<em><b>Delta</b></em>' attribute feature.
@@ -5403,13 +5403,13 @@ public interface IPos_DatamodelPackage extends EPackage {
 		EAttribute EVENT_FILTER_CONDITION__FILTER_STRUCTURE = eINSTANCE.getEventFilterCondition_FilterStructure();
 
 		/**
-		 * The meta object literal for the '<em><b>Position Condition Cell</b></em>' attribute feature.
+		 * The meta object literal for the '<em><b>Position Condition Cells</b></em>' attribute feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EAttribute EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL = eINSTANCE
-				.getEventFilterCondition_PositionConditionCell();
+		EAttribute EVENT_FILTER_CONDITION__POSITION_CONDITION_CELLS = eINSTANCE
+				.getEventFilterCondition_PositionConditionCells();
 
 		/**
 		 * The meta object literal for the '<em><b>Id Condition</b></em>' attribute feature.
@@ -5427,15 +5427,6 @@ public interface IPos_DatamodelPackage extends EPackage {
 		 */
 		EAttribute EVENT_FILTER_CONDITION__CATEGORY_CONDITION = eINSTANCE.getEventFilterCondition_CategoryCondition();
 
-		/**
-		 * The meta object literal for the '<em><b>Position Condition Cell Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL_ID = eINSTANCE
-				.getEventFilterCondition_PositionConditionCellId();
-
 		/**
 		 * The meta object literal for the '{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.ZoneDescriptorImpl <em>Zone Descriptor</em>}' class.
 		 * <!-- begin-user-doc -->
@@ -5481,6 +5472,15 @@ public interface IPos_DatamodelPackage extends EPackage {
 		EReference DATA_STORAGE_QUERY_RESPONSE__POSITION_EVENTS = eINSTANCE
 				.getDataStorageQueryResponse_PositionEvents();
 
+		/**
+		 * The meta object literal for the '<em><b>Tracking Task Id</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_STORAGE_QUERY_RESPONSE__TRACKING_TASK_ID = eINSTANCE
+				.getDataStorageQueryResponse_TrackingTaskId();
+
 		/**
 		 * The meta object literal for the '<em>String List</em>' data type.
 		 * <!-- begin-user-doc -->
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/MonitoringRequest.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/MonitoringRequest.java
index e240a189693b6e738ca63d0b44d222b517970866..4c3f7df316a59d61681c2b302753e45d24a87e40 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/MonitoringRequest.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/MonitoringRequest.java
@@ -15,7 +15,7 @@ import org.eclipse.emf.ecore.EObject;
  * The following features are supported:
  * </p>
  * <ul>
- *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getFrameId <em>Frame Id</em>}</li>
+ *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getFrameIds <em>Frame Ids</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getDelta <em>Delta</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getUpdateFrequency <em>Update Frequency</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getType <em>Type</em>}</li>
@@ -34,26 +34,26 @@ import org.eclipse.emf.ecore.EObject;
  */
 public interface MonitoringRequest extends EObject {
 	/**
-	 * Returns the value of the '<em><b>Frame Id</b></em>' attribute.
+	 * Returns the value of the '<em><b>Frame Ids</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Frame Id</em>' attribute.
-	 * @see #setFrameId(String)
-	 * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getMonitoringRequest_FrameId()
-	 * @model dataType="org.eclipse.emf.ecore.xml.type.String"
+	 * @return the value of the '<em>Frame Ids</em>' attribute.
+	 * @see #setFrameIds(List)
+	 * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getMonitoringRequest_FrameIds()
+	 * @model dataType="ipos.project.DataModellntegration.iPos_Datamodel.StringList"
 	 * @generated
 	 */
-	String getFrameId();
+	List<String> getFrameIds();
 
 	/**
-	 * Sets the value of the '{@link ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getFrameId <em>Frame Id</em>}' attribute.
+	 * Sets the value of the '{@link ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest#getFrameIds <em>Frame Ids</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Frame Id</em>' attribute.
-	 * @see #getFrameId()
+	 * @param value the new value of the '<em>Frame Ids</em>' attribute.
+	 * @see #getFrameIds()
 	 * @generated
 	 */
-	void setFrameId(String value);
+	void setFrameIds(List<String> value);
 
 	/**
 	 * Returns the value of the '<em><b>Delta</b></em>' attribute.
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/DataStorageQueryResponseImpl.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/DataStorageQueryResponseImpl.java
index 62f001423a9714e636a51697e29c747d4c2cfbe1..a39f191c3457d962f2dea3d88848841829353e9d 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/DataStorageQueryResponseImpl.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/DataStorageQueryResponseImpl.java
@@ -8,10 +8,12 @@ import ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent;
 
 import java.util.Collection;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.util.EList;
 
 import org.eclipse.emf.ecore.EClass;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
 
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
@@ -25,6 +27,7 @@ import org.eclipse.emf.ecore.util.EObjectResolvingEList;
  * </p>
  * <ul>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.DataStorageQueryResponseImpl#getPositionEvents <em>Position Events</em>}</li>
+ *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.DataStorageQueryResponseImpl#getTrackingTaskId <em>Tracking Task Id</em>}</li>
  * </ul>
  *
  * @generated
@@ -40,6 +43,25 @@ public class DataStorageQueryResponseImpl extends MinimalEObjectImpl.Container i
 	 */
 	protected EList<PositionEvent> positionEvents;
 
+	/**
+	 * The default value of the '{@link #getTrackingTaskId() <em>Tracking Task Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTrackingTaskId()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String TRACKING_TASK_ID_EDEFAULT = null;
+	/**
+	 * The cached value of the '{@link #getTrackingTaskId() <em>Tracking Task Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTrackingTaskId()
+	 * @generated
+	 * @ordered
+	 */
+	protected String trackingTaskId = TRACKING_TASK_ID_EDEFAULT;
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -72,6 +94,29 @@ public class DataStorageQueryResponseImpl extends MinimalEObjectImpl.Container i
 		return positionEvents;
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getTrackingTaskId() {
+		return trackingTaskId;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTrackingTaskId(String newTrackingTaskId) {
+		String oldTrackingTaskId = trackingTaskId;
+		trackingTaskId = newTrackingTaskId;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					IPos_DatamodelPackage.DATA_STORAGE_QUERY_RESPONSE__TRACKING_TASK_ID, oldTrackingTaskId,
+					trackingTaskId));
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -82,6 +127,8 @@ public class DataStorageQueryResponseImpl extends MinimalEObjectImpl.Container i
 		switch (featureID) {
 		case IPos_DatamodelPackage.DATA_STORAGE_QUERY_RESPONSE__POSITION_EVENTS:
 			return getPositionEvents();
+		case IPos_DatamodelPackage.DATA_STORAGE_QUERY_RESPONSE__TRACKING_TASK_ID:
+			return getTrackingTaskId();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -99,6 +146,9 @@ public class DataStorageQueryResponseImpl extends MinimalEObjectImpl.Container i
 			getPositionEvents().clear();
 			getPositionEvents().addAll((Collection<? extends PositionEvent>) newValue);
 			return;
+		case IPos_DatamodelPackage.DATA_STORAGE_QUERY_RESPONSE__TRACKING_TASK_ID:
+			setTrackingTaskId((String) newValue);
+			return;
 		}
 		super.eSet(featureID, newValue);
 	}
@@ -114,6 +164,9 @@ public class DataStorageQueryResponseImpl extends MinimalEObjectImpl.Container i
 		case IPos_DatamodelPackage.DATA_STORAGE_QUERY_RESPONSE__POSITION_EVENTS:
 			getPositionEvents().clear();
 			return;
+		case IPos_DatamodelPackage.DATA_STORAGE_QUERY_RESPONSE__TRACKING_TASK_ID:
+			setTrackingTaskId(TRACKING_TASK_ID_EDEFAULT);
+			return;
 		}
 		super.eUnset(featureID);
 	}
@@ -128,8 +181,28 @@ public class DataStorageQueryResponseImpl extends MinimalEObjectImpl.Container i
 		switch (featureID) {
 		case IPos_DatamodelPackage.DATA_STORAGE_QUERY_RESPONSE__POSITION_EVENTS:
 			return positionEvents != null && !positionEvents.isEmpty();
+		case IPos_DatamodelPackage.DATA_STORAGE_QUERY_RESPONSE__TRACKING_TASK_ID:
+			return TRACKING_TASK_ID_EDEFAULT == null ? trackingTaskId != null
+					: !TRACKING_TASK_ID_EDEFAULT.equals(trackingTaskId);
 		}
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy())
+			return super.toString();
+
+		StringBuilder result = new StringBuilder(super.toString());
+		result.append(" (trackingTaskId: ");
+		result.append(trackingTaskId);
+		result.append(')');
+		return result.toString();
+	}
+
 } //DataStorageQueryResponseImpl
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java
index 7d28c6e1e1fe608c77d104f4114fb6489aca288f..8dee28cba3a855ca9ec063cd9bb7a63f6cbc875b 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java
@@ -8,6 +8,7 @@ import ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage;
 import java.util.ArrayList;
 import java.util.List;
 
+import java.util.Map;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.ecore.EClass;
@@ -30,10 +31,9 @@ import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getPositionDelta <em>Position Delta</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getSensorIdCondition <em>Sensor Id Condition</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getFilterStructure <em>Filter Structure</em>}</li>
- *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getPositionConditionCell <em>Position Condition Cell</em>}</li>
+ *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getPositionConditionCells <em>Position Condition Cells</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getIdCondition <em>Id Condition</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getCategoryCondition <em>Category Condition</em>}</li>
- *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getPositionConditionCellId <em>Position Condition Cell Id</em>}</li>
  * </ul>
  *
  * @generated
@@ -180,24 +180,14 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 	protected boolean[] filterStructure = FILTER_STRUCTURE_EDEFAULT;
 
 	/**
-	 * The default value of the '{@link #getPositionConditionCell() <em>Position Condition Cell</em>}' attribute.
+	 * The cached value of the '{@link #getPositionConditionCells() <em>Position Condition Cells</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getPositionConditionCell()
+	 * @see #getPositionConditionCells()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final ArrayList<Float[][]> POSITION_CONDITION_CELL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPositionConditionCell() <em>Position Condition Cell</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPositionConditionCell()
-	 * @generated
-	 * @ordered
-	 */
-	protected ArrayList<Float[][]> positionConditionCell = POSITION_CONDITION_CELL_EDEFAULT;
+	protected Map<String, ArrayList<Float[][]>> positionConditionCells;
 
 	/**
 	 * The default value of the '{@link #getIdCondition() <em>Id Condition</em>}' attribute.
@@ -239,26 +229,6 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 	 */
 	protected List<String> categoryCondition = CATEGORY_CONDITION_EDEFAULT;
 
-	/**
-	 * The default value of the '{@link #getPositionConditionCellId() <em>Position Condition Cell Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPositionConditionCellId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String POSITION_CONDITION_CELL_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPositionConditionCellId() <em>Position Condition Cell Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPositionConditionCellId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String positionConditionCellId = POSITION_CONDITION_CELL_ID_EDEFAULT;
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -442,8 +412,8 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public ArrayList<Float[][]> getPositionConditionCell() {
-		return positionConditionCell;
+	public Map<String, ArrayList<Float[][]>> getPositionConditionCells() {
+		return positionConditionCells;
 	}
 
 	/**
@@ -451,13 +421,13 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setPositionConditionCell(ArrayList<Float[][]> newPositionConditionCell) {
-		ArrayList<Float[][]> oldPositionConditionCell = positionConditionCell;
-		positionConditionCell = newPositionConditionCell;
+	public void setPositionConditionCells(Map<String, ArrayList<Float[][]>> newPositionConditionCells) {
+		Map<String, ArrayList<Float[][]>> oldPositionConditionCells = positionConditionCells;
+		positionConditionCells = newPositionConditionCells;
 		if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET,
-					IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL, oldPositionConditionCell,
-					positionConditionCell));
+					IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELLS, oldPositionConditionCells,
+					positionConditionCells));
 	}
 
 	/**
@@ -505,29 +475,6 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 					categoryCondition));
 	}
 
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPositionConditionCellId() {
-		return positionConditionCellId;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPositionConditionCellId(String newPositionConditionCellId) {
-		String oldPositionConditionCellId = positionConditionCellId;
-		positionConditionCellId = newPositionConditionCellId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL_ID,
-					oldPositionConditionCellId, positionConditionCellId));
-	}
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -550,14 +497,12 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 			return getSensorIdCondition();
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__FILTER_STRUCTURE:
 			return getFilterStructure();
-		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL:
-			return getPositionConditionCell();
+		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELLS:
+			return getPositionConditionCells();
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__ID_CONDITION:
 			return getIdCondition();
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION:
 			return getCategoryCondition();
-		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL_ID:
-			return getPositionConditionCellId();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -592,8 +537,8 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__FILTER_STRUCTURE:
 			setFilterStructure((boolean[]) newValue);
 			return;
-		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL:
-			setPositionConditionCell((ArrayList<Float[][]>) newValue);
+		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELLS:
+			setPositionConditionCells((Map<String, ArrayList<Float[][]>>) newValue);
 			return;
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__ID_CONDITION:
 			setIdCondition((List<String>) newValue);
@@ -601,9 +546,6 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION:
 			setCategoryCondition((List<String>) newValue);
 			return;
-		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL_ID:
-			setPositionConditionCellId((String) newValue);
-			return;
 		}
 		super.eSet(featureID, newValue);
 	}
@@ -637,8 +579,8 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__FILTER_STRUCTURE:
 			setFilterStructure(FILTER_STRUCTURE_EDEFAULT);
 			return;
-		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL:
-			setPositionConditionCell(POSITION_CONDITION_CELL_EDEFAULT);
+		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELLS:
+			setPositionConditionCells((Map<String, ArrayList<Float[][]>>) null);
 			return;
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__ID_CONDITION:
 			setIdCondition(ID_CONDITION_EDEFAULT);
@@ -646,9 +588,6 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION:
 			setCategoryCondition(CATEGORY_CONDITION_EDEFAULT);
 			return;
-		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL_ID:
-			setPositionConditionCellId(POSITION_CONDITION_CELL_ID_EDEFAULT);
-			return;
 		}
 		super.eUnset(featureID);
 	}
@@ -679,17 +618,13 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__FILTER_STRUCTURE:
 			return FILTER_STRUCTURE_EDEFAULT == null ? filterStructure != null
 					: !FILTER_STRUCTURE_EDEFAULT.equals(filterStructure);
-		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL:
-			return POSITION_CONDITION_CELL_EDEFAULT == null ? positionConditionCell != null
-					: !POSITION_CONDITION_CELL_EDEFAULT.equals(positionConditionCell);
+		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELLS:
+			return positionConditionCells != null;
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__ID_CONDITION:
 			return ID_CONDITION_EDEFAULT == null ? idCondition != null : !ID_CONDITION_EDEFAULT.equals(idCondition);
 		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION:
 			return CATEGORY_CONDITION_EDEFAULT == null ? categoryCondition != null
 					: !CATEGORY_CONDITION_EDEFAULT.equals(categoryCondition);
-		case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL_ID:
-			return POSITION_CONDITION_CELL_ID_EDEFAULT == null ? positionConditionCellId != null
-					: !POSITION_CONDITION_CELL_ID_EDEFAULT.equals(positionConditionCellId);
 		}
 		return super.eIsSet(featureID);
 	}
@@ -719,14 +654,12 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		result.append(sensorIdCondition);
 		result.append(", filterStructure: ");
 		result.append(filterStructure);
-		result.append(", positionConditionCell: ");
-		result.append(positionConditionCell);
+		result.append(", positionConditionCells: ");
+		result.append(positionConditionCells);
 		result.append(", idCondition: ");
 		result.append(idCondition);
 		result.append(", categoryCondition: ");
 		result.append(categoryCondition);
-		result.append(", positionConditionCellId: ");
-		result.append(positionConditionCellId);
 		result.append(')');
 		return result.toString();
 	}
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java
index c581d858fb63fb8f8f58f1c77488cfa30083064d..935f3769b7ec9c4cc17a6a1ed87f01437cb4ae6f 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java
@@ -1251,7 +1251,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getMonitoringRequest_FrameId() {
+	public EAttribute getMonitoringRequest_FrameIds() {
 		return (EAttribute) monitoringRequestEClass.getEStructuralFeatures().get(0);
 	}
 
@@ -1728,7 +1728,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getEventFilterCondition_PositionConditionCell() {
+	public EAttribute getEventFilterCondition_PositionConditionCells() {
 		return (EAttribute) eventFilterConditionEClass.getEStructuralFeatures().get(7);
 	}
 
@@ -1750,15 +1750,6 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		return (EAttribute) eventFilterConditionEClass.getEStructuralFeatures().get(9);
 	}
 
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEventFilterCondition_PositionConditionCellId() {
-		return (EAttribute) eventFilterConditionEClass.getEStructuralFeatures().get(10);
-	}
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1804,6 +1795,15 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		return (EReference) dataStorageQueryResponseEClass.getEStructuralFeatures().get(0);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataStorageQueryResponse_TrackingTaskId() {
+		return (EAttribute) dataStorageQueryResponseEClass.getEStructuralFeatures().get(1);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1988,7 +1988,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		trackingRequestEClass = createEClass(TRACKING_REQUEST);
 
 		monitoringRequestEClass = createEClass(MONITORING_REQUEST);
-		createEAttribute(monitoringRequestEClass, MONITORING_REQUEST__FRAME_ID);
+		createEAttribute(monitoringRequestEClass, MONITORING_REQUEST__FRAME_IDS);
 		createEAttribute(monitoringRequestEClass, MONITORING_REQUEST__DELTA);
 		createEAttribute(monitoringRequestEClass, MONITORING_REQUEST__UPDATE_FREQUENCY);
 		createEAttribute(monitoringRequestEClass, MONITORING_REQUEST__TYPE);
@@ -2058,10 +2058,9 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__POSITION_DELTA);
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__SENSOR_ID_CONDITION);
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__FILTER_STRUCTURE);
-		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL);
+		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__POSITION_CONDITION_CELLS);
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__ID_CONDITION);
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__CATEGORY_CONDITION);
-		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL_ID);
 
 		zoneDescriptorEClass = createEClass(ZONE_DESCRIPTOR);
 		createEAttribute(zoneDescriptorEClass, ZONE_DESCRIPTOR__ZONE_ID);
@@ -2069,6 +2068,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 
 		dataStorageQueryResponseEClass = createEClass(DATA_STORAGE_QUERY_RESPONSE);
 		createEReference(dataStorageQueryResponseEClass, DATA_STORAGE_QUERY_RESPONSE__POSITION_EVENTS);
+		createEAttribute(dataStorageQueryResponseEClass, DATA_STORAGE_QUERY_RESPONSE__TRACKING_TASK_ID);
 
 		// Create data types
 		stringListEDataType = createEDataType(STRING_LIST);
@@ -2351,7 +2351,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 
 		initEClass(monitoringRequestEClass, MonitoringRequest.class, "MonitoringRequest", !IS_ABSTRACT, !IS_INTERFACE,
 				IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getMonitoringRequest_FrameId(), theXMLTypePackage.getString(), "frameId", null, 0, 1,
+		initEAttribute(getMonitoringRequest_FrameIds(), this.getStringList(), "frameIds", null, 0, 1,
 				MonitoringRequest.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
 				!IS_DERIVED, IS_ORDERED);
 		initEAttribute(getMonitoringRequest_Delta(), theXMLTypePackage.getFloat(), "delta", null, 0, 1,
@@ -2534,18 +2534,20 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		initEAttribute(getEventFilterCondition_FilterStructure(), this.getBooleanList(), "filterStructure", null, 0, 1,
 				EventFilterCondition.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID,
 				IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getEventFilterCondition_PositionConditionCell(), this.getFloatArray3d(), "positionConditionCell",
-				null, 0, 1, EventFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		g1 = createEGenericType(ecorePackage.getEMap());
+		g2 = createEGenericType(theXMLTypePackage.getString());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(this.getFloatArray3d());
+		g1.getETypeArguments().add(g2);
+		initEAttribute(getEventFilterCondition_PositionConditionCells(), g1, "positionConditionCells", null, 0, 1,
+				EventFilterCondition.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID,
+				IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getEventFilterCondition_IdCondition(), this.getStringList(), "idCondition", null, 0, 1,
 				EventFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID,
 				IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getEventFilterCondition_CategoryCondition(), this.getStringList(), "categoryCondition", null, 0,
 				1, EventFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID,
 				IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getEventFilterCondition_PositionConditionCellId(), theXMLTypePackage.getString(),
-				"positionConditionCellId", null, 0, 1, EventFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(zoneDescriptorEClass, ZoneDescriptor.class, "ZoneDescriptor", !IS_ABSTRACT, !IS_INTERFACE,
 				IS_GENERATED_INSTANCE_CLASS);
@@ -2561,6 +2563,9 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		initEReference(getDataStorageQueryResponse_PositionEvents(), this.getPositionEvent(), null, "positionEvents",
 				null, 0, -1, DataStorageQueryResponse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE,
 				IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataStorageQueryResponse_TrackingTaskId(), theXMLTypePackage.getString(), "trackingTaskId",
+				null, 0, 1, DataStorageQueryResponse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
+				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		// Initialize data types
 		initEDataType(stringListEDataType, List.class, "StringList", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS,
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/MonitoringRequestImpl.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/MonitoringRequestImpl.java
index e05796843ad5e57d8c650d1fb3a20d77851c5946..91feb43d9c4af5bd9b6727fabd713e201005c4c6 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/MonitoringRequestImpl.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/MonitoringRequestImpl.java
@@ -22,7 +22,7 @@ import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
  * The following features are implemented:
  * </p>
  * <ul>
- *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.MonitoringRequestImpl#getFrameId <em>Frame Id</em>}</li>
+ *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.MonitoringRequestImpl#getFrameIds <em>Frame Ids</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.MonitoringRequestImpl#getDelta <em>Delta</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.MonitoringRequestImpl#getUpdateFrequency <em>Update Frequency</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.MonitoringRequestImpl#getType <em>Type</em>}</li>
@@ -39,24 +39,24 @@ import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
  */
 public class MonitoringRequestImpl extends MinimalEObjectImpl.Container implements MonitoringRequest {
 	/**
-	 * The default value of the '{@link #getFrameId() <em>Frame Id</em>}' attribute.
+	 * The default value of the '{@link #getFrameIds() <em>Frame Ids</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getFrameId()
+	 * @see #getFrameIds()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final String FRAME_ID_EDEFAULT = null;
+	protected static final List<String> FRAME_IDS_EDEFAULT = null;
 
 	/**
-	 * The cached value of the '{@link #getFrameId() <em>Frame Id</em>}' attribute.
+	 * The cached value of the '{@link #getFrameIds() <em>Frame Ids</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getFrameId()
+	 * @see #getFrameIds()
 	 * @generated
 	 * @ordered
 	 */
-	protected String frameId = FRAME_ID_EDEFAULT;
+	protected List<String> frameIds = FRAME_IDS_EDEFAULT;
 
 	/**
 	 * The default value of the '{@link #getDelta() <em>Delta</em>}' attribute.
@@ -282,8 +282,8 @@ public class MonitoringRequestImpl extends MinimalEObjectImpl.Container implemen
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public String getFrameId() {
-		return frameId;
+	public List<String> getFrameIds() {
+		return frameIds;
 	}
 
 	/**
@@ -291,12 +291,12 @@ public class MonitoringRequestImpl extends MinimalEObjectImpl.Container implemen
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setFrameId(String newFrameId) {
-		String oldFrameId = frameId;
-		frameId = newFrameId;
+	public void setFrameIds(List<String> newFrameIds) {
+		List<String> oldFrameIds = frameIds;
+		frameIds = newFrameIds;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, IPos_DatamodelPackage.MONITORING_REQUEST__FRAME_ID,
-					oldFrameId, frameId));
+			eNotify(new ENotificationImpl(this, Notification.SET, IPos_DatamodelPackage.MONITORING_REQUEST__FRAME_IDS,
+					oldFrameIds, frameIds));
 	}
 
 	/**
@@ -531,8 +531,8 @@ public class MonitoringRequestImpl extends MinimalEObjectImpl.Container implemen
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-		case IPos_DatamodelPackage.MONITORING_REQUEST__FRAME_ID:
-			return getFrameId();
+		case IPos_DatamodelPackage.MONITORING_REQUEST__FRAME_IDS:
+			return getFrameIds();
 		case IPos_DatamodelPackage.MONITORING_REQUEST__DELTA:
 			return getDelta();
 		case IPos_DatamodelPackage.MONITORING_REQUEST__UPDATE_FREQUENCY:
@@ -566,8 +566,8 @@ public class MonitoringRequestImpl extends MinimalEObjectImpl.Container implemen
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-		case IPos_DatamodelPackage.MONITORING_REQUEST__FRAME_ID:
-			setFrameId((String) newValue);
+		case IPos_DatamodelPackage.MONITORING_REQUEST__FRAME_IDS:
+			setFrameIds((List<String>) newValue);
 			return;
 		case IPos_DatamodelPackage.MONITORING_REQUEST__DELTA:
 			setDelta((Float) newValue);
@@ -611,8 +611,8 @@ public class MonitoringRequestImpl extends MinimalEObjectImpl.Container implemen
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-		case IPos_DatamodelPackage.MONITORING_REQUEST__FRAME_ID:
-			setFrameId(FRAME_ID_EDEFAULT);
+		case IPos_DatamodelPackage.MONITORING_REQUEST__FRAME_IDS:
+			setFrameIds(FRAME_IDS_EDEFAULT);
 			return;
 		case IPos_DatamodelPackage.MONITORING_REQUEST__DELTA:
 			setDelta(DELTA_EDEFAULT);
@@ -656,8 +656,8 @@ public class MonitoringRequestImpl extends MinimalEObjectImpl.Container implemen
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-		case IPos_DatamodelPackage.MONITORING_REQUEST__FRAME_ID:
-			return FRAME_ID_EDEFAULT == null ? frameId != null : !FRAME_ID_EDEFAULT.equals(frameId);
+		case IPos_DatamodelPackage.MONITORING_REQUEST__FRAME_IDS:
+			return FRAME_IDS_EDEFAULT == null ? frameIds != null : !FRAME_IDS_EDEFAULT.equals(frameIds);
 		case IPos_DatamodelPackage.MONITORING_REQUEST__DELTA:
 			return delta != DELTA_EDEFAULT;
 		case IPos_DatamodelPackage.MONITORING_REQUEST__UPDATE_FREQUENCY:
@@ -697,8 +697,8 @@ public class MonitoringRequestImpl extends MinimalEObjectImpl.Container implemen
 			return super.toString();
 
 		StringBuilder result = new StringBuilder(super.toString());
-		result.append(" (frameId: ");
-		result.append(frameId);
+		result.append(" (frameIds: ");
+		result.append(frameIds);
 		result.append(", delta: ");
 		result.append(delta);
 		result.append(", updateFrequency: ");
diff --git a/src/main/java/ipos/project/Functionality/DataServices.java b/src/main/java/ipos/project/Functionality/DataServices.java
index 67c656493120905aab2a7ac6e9b47be59d5b8cf4..748a6a5e7618db238b2d1ffe6f25f9cc66e17b99 100644
--- a/src/main/java/ipos/project/Functionality/DataServices.java
+++ b/src/main/java/ipos/project/Functionality/DataServices.java
@@ -97,11 +97,11 @@ public class DataServices {
     public static void addAgent(Agent agent_input) {
         for (Agent agent_loaded : wma.getAllAgents()){
             if (agent_loaded.getId().equals(agent_input.getId())){
-                Agent agent_merged = mergeAgents(agent_loaded, agent_input);
-
+                mergeInputAgentIntoLoadedAgent(agent_loaded, agent_input);
+                return;
                 // TODO: careful: What about those LObjects that point on the currently existing agent-object?
-                wma.removeAgent(agent_loaded.getId());
-                wma.addAgent(agent_merged);
+                // wma.removeAgent(agent_loaded.getId());
+                // wma.addAgent(agent_merged);
             }
         }
         wma.addAgent(agent_input);
@@ -114,12 +114,13 @@ public class DataServices {
      * @param agent_input
      * @return
      */
-    private static Agent mergeAgents(Agent agent_loaded, Agent agent_input) {
+    private static Agent mergeInputAgentIntoLoadedAgent(Agent agent_loaded, Agent agent_input) {
         List<LocalizableObject> lObjects_loaded = agent_loaded.getLObject();
         List<LocalizableObject> lObjects_input = agent_input.getLObject();
         for (LocalizableObject lObject_input : lObjects_input){
             if (!containsLObjectId(lObjects_loaded, lObject_input.getId())){
                 lObjects_loaded.add(lObject_input);
+                LOG.info("Added lObject with id " + lObject_input.getId() + " to agent " + agent_loaded.getId());
             }
         }
         return agent_loaded;
diff --git a/src/main/java/ipos/project/Functionality/eventfilter/FilteringResult.java b/src/main/java/ipos/project/Functionality/eventfilter/FilteringResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..9049e3931050d1deef3d0b5f57f8800d9cc49a0c
--- /dev/null
+++ b/src/main/java/ipos/project/Functionality/eventfilter/FilteringResult.java
@@ -0,0 +1,45 @@
+package ipos.project.Functionality.eventfilter;
+
+import ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent;
+
+import java.util.List;
+
+public class FilteringResult {
+
+    public FilteringResult(String monitoringTaskId, PositionEvent posEvent, boolean isBlocking, List<String> matchingPositionConditionCells, List<String> allPositionConditionCells){
+        this.monitoringTaskId = monitoringTaskId;
+        this.posEvent = posEvent;
+        this.isBlocking = isBlocking;
+        this.matchingPositionConditionCells = matchingPositionConditionCells;
+        this.nonMatchingPositionConditionCells = allPositionConditionCells;
+        this.nonMatchingPositionConditionCells.removeAll(matchingPositionConditionCells);
+    }
+
+    public String getMonitoringTaskId() {
+        return monitoringTaskId;
+    }
+
+    private String monitoringTaskId;
+    private boolean isBlocking;
+    private List<String> matchingPositionConditionCells;
+    private List<String> nonMatchingPositionConditionCells;
+
+
+    public PositionEvent getPosEvent() {
+        return posEvent;
+    }
+
+    private PositionEvent posEvent;
+
+    public boolean hasBlockedEvent(){
+        return this.isBlocking;
+    }
+
+    public List<String> getMatchingPositionConditionCellIds() {
+        return this.matchingPositionConditionCells;
+    }
+
+    public List<String> getNonMatchingPositionConditionCellIds(){
+        return this.nonMatchingPositionConditionCells;
+    }
+}
diff --git a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
index 99732ba87e808f6d2f5a193519bab83f493ecbf4..b599511622e3e5d6dbee81b4aa58049a8dfb09ce 100644
--- a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
+++ b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
@@ -9,9 +9,7 @@ import java.sql.Timestamp;
 import java.lang.Math;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 
 public class eventFilter {
@@ -54,7 +52,7 @@ public class eventFilter {
     private ArrayList<Float[]> positionCondition;
     private int timeMinInterval;
     private float positionDelta;
-    private ArrayList<Float[][]> positionConditionCell;
+    private Map<String, ArrayList<Float[][]>> positionConditionCells; // zoneId -> PositionConditionCell
     private EventFilterCondition filterConditionConfig;
 
     public void init(EventFilterCondition conf) {
@@ -67,7 +65,7 @@ public class eventFilter {
         positionCondition = conf.getPositionCondition();
         timeMinInterval = conf.getTimeMinInterval();
         positionDelta = conf.getPositionDelta();
-        positionConditionCell = conf.getPositionConditionCell();
+        positionConditionCells = conf.getPositionConditionCells();
         this.filterConditionConfig = conf;
     }
 
@@ -103,22 +101,23 @@ public class eventFilter {
         }
     }
 
-    public boolean process(PositionEvent event) throws ParseException {
+    public FilteringResult process(PositionEvent event) throws ParseException {
         IPos_DatamodelFactory dataModelFactory = IPos_DatamodelFactory.eINSTANCE;
         LocalizableObject lObject = DataServices.getLObjectByIdOrNull(event.getLObjectId());
         boolean flag = false; //false for pass, true for block
+        List<String> matchingCells = new LinkedList<>();
         if (null == event.getPlacing() || null == event.getPlacing().getPosition() || null == event.getPlacing().getPosition().getPoint()){
             LOG.info("EventFilter: Warning: Received event with unknown Position. Sensor-id: " + event.getLObjectId());
-            return true;
+            return new FilteringResult(getMonitoringTaskId(), event,true, matchingCells, new ArrayList<>(this.positionConditionCells.keySet()));
         }
         if (null == lObject){
             LOG.info("EventFilter: Warning: Received event from sensor with unknown sensor-id: " + event.getLObjectId());
-            return true;
+            return new FilteringResult(getMonitoringTaskId(), event,true, matchingCells, new ArrayList<>(this.positionConditionCells.keySet()));
         }
         Agent agent = lObject.getAgent();
         if (null == agent){
             LOG.info("EventFilter: Warning: Received event for sensor-id with unknown agent. Sensor-id: " + lObject.getId());
-            return true;
+            return new FilteringResult(getMonitoringTaskId(), event,true, matchingCells, new ArrayList<>(this.positionConditionCells.keySet()));
         }
 
         LOG.info("Eventfilter: Filter structure: " + filterStructure[0] + ", " + filterStructure[1] + ", " + filterStructure[2] + ", " + filterStructure[3] + ", " + filterStructure[4] + ", " + filterStructure[5] + ", " + filterStructure[6] + ", " + filterStructure[7]);
@@ -260,21 +259,36 @@ public class eventFilter {
         if (filterStructure[8] && !flag) {
             flag = true; //switch the filter status to block, if the event meet the filter condition, switch to pass
             Position position = event.getPlacing().getPosition();
-            for (int i = 0; i < positionConditionCell.size(); i++) {
-                if (position.getPoint() instanceof Point3D) {
-                    Point3D cod = (Point3D) position.getPoint();
-                    if (is_in_cell(cod, positionConditionCell.get(i)[0], positionConditionCell.get(i)[1], positionConditionCell.get(i)[2])) {
-                        flag = false;
-                    }
+            for (Map.Entry<String, ArrayList<Float[][]>> identifiedCell : positionConditionCells.entrySet()){
+                boolean evalResult = evaluatePositionConditionCell(position, identifiedCell.getValue());
+                if (!evalResult){ // let the event pass if filter is not blocking for at least one cell
+                    flag = false;
+                    matchingCells.add(identifiedCell.getKey());
                 }
             }
         }
         LOG.info("Eventfilter: Filter status (positionCondition_cell) " + ": " + flag);
+        LOG.info("Eventfilter: EventFilter " + getMonitoringTaskId() + " accepted zones " + matchingCells.toString());
+        LOG.info("INDFRO-DEBUG: EventFilter " + getMonitoringTaskId() + " accepted zones " + matchingCells.toString());
 
         if (!flag) {
             last_position_event = event;
         }
-        return flag;
+        FilteringResult filteringResult = new FilteringResult(getMonitoringTaskId(), event, flag, matchingCells, new ArrayList<>(this.positionConditionCells.keySet()));
+        return filteringResult;
+    }
+
+    private boolean evaluatePositionConditionCell(Position position, ArrayList<Float[][]> positionConditionCell) {
+        boolean result = true;
+        for (int i = 0; i < positionConditionCell.size(); i++) {
+            if (position.getPoint() instanceof Point3D) {
+                Point3D cod = (Point3D) position.getPoint();
+                if (is_in_cell(cod, positionConditionCell.get(i)[0], positionConditionCell.get(i)[1], positionConditionCell.get(i)[2])) {
+                    result = false;
+                }
+            }
+        }
+        return result;
     }
 
     public boolean respectsAccuracySdfForPosEvent(PositionEvent posEvent) {
diff --git a/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java b/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java
index c038fa7b2b1b8c2c29a17fca3eab669b5d9d6454..2406ab20eec590b1c67dc9e3b389413fe13017ce 100644
--- a/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java
+++ b/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java
@@ -24,17 +24,16 @@ public class readConfig {
      */
     public static boolean readFilterConfigFromMonitoringRequest (MonitoringRequest monReq, EventFilterCondition config){
         // TODO: support other criteria than "position_condition_cell"
-        //float delta_monReq = monReq.getDelta();
-        String frameId_monReq = monReq.getFrameId();
-        Zone zone_monReq = DataServices.getZoneByIdOrNull(frameId_monReq);
-        if (null == zone_monReq){
-            LOG.warn("MonitoringRequest contained an invalid Zone-id");
-            return false;
-        }
         config.setFilterStructure(new boolean[] {false, false, false, false, false, false, false, false, true});
-        //config.setPositionDelta(delta_monReq);
-        config.setPositionConditionCell(transformZone2PositionConditionCell(zone_monReq));
-        config.setPositionConditionCellId(zone_monReq.getId());
+        for (String frameId : monReq.getFrameIds()){
+            Zone zone_monReq = DataServices.getZoneByIdOrNull(frameId);
+            if (null == zone_monReq){
+                LOG.warn("MonitoringRequest contained an invalid Zone-id");
+                return false;
+            }
+            ArrayList<Float[][]> positionConditionCell = transformZone2PositionConditionCell(zone_monReq);
+            config.getPositionConditionCells().put(frameId, positionConditionCell);
+        }
         return true;
     }
 
@@ -276,7 +275,7 @@ public class readConfig {
                 position_condition_cell.add(cell_c);
             }
             filter_structure[8] = true;
-            config.setPositionConditionCell(position_condition_cell);
+            config.getPositionConditionCells().put("DefaultZoneId", position_condition_cell);
         }
         else {
             filter_structure[8]=false;
diff --git a/src/main/java/ipos/project/MainApp.java b/src/main/java/ipos/project/MainApp.java
index 4db309752fb8320c063145523a5a52ba71c6d07e..0dbfb419ab088d98bd80c44e2e72d7267f3d8473 100644
--- a/src/main/java/ipos/project/MainApp.java
+++ b/src/main/java/ipos/project/MainApp.java
@@ -19,12 +19,16 @@ public class MainApp {
 	public static final String INDUSTRIEROBOTIK_FILE = "./init_Industrierobotik.txt";
     public static final String SENSORDATENFUSION_FILE = "./init_Sensordatenfusion.txt";
     public static final String TESTRAWDATA_FILE = "./testdata_raw.txt";
+    public static final String TESTDATA_INDFRO = "./testdata_raw_indfro.txt";
+    public static final String TESTDATA_QUERY = "./testdata_raw_query.txt";
+
 
     public static void main(String[] args) throws ParseException {
         SpringApplication.run(MainApp.class, args);
         // SimpleSceneIntegration.init();
-        // SimpleSceneIntegration.init(INDUSTRIEROBOTIK_FILE);
-        SimpleSceneIntegration.init(SENSORDATENFUSION_FILE);
-        GenericSensorValueProcessor.processTestData(TESTRAWDATA_FILE);
+        SimpleSceneIntegration.init(INDUSTRIEROBOTIK_FILE);
+        // SimpleSceneIntegration.init(SENSORDATENFUSION_FILE);
+        GenericSensorValueProcessor.processTestData(TESTDATA_INDFRO);
+        SimpleSceneIntegration.handleMessageFile(TESTDATA_QUERY);
 	}
 }
diff --git a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
index e6a55e87118b6ad241ea34a3bd227a184702f273..3ca1693fc0340e1f8e6f2e20e8e9dce846ae96da 100644
--- a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
+++ b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
@@ -5,16 +5,17 @@ import ipos.project.DataModellntegration.iPos_Datamodel.*;
 import ipos.project.Functionality.DataServices;
 import ipos.project.Functionality.PositionCalculation;
 import ipos.project.Functionality.SensorDataFusion;
+import ipos.project.Functionality.eventfilter.FilteringResult;
 import ipos.project.Functionality.eventfilter.eventFilter;
 import ipos.project.Functionality.eventfilter.readConfig;
 import org.apache.logging.log4j.LogManager;
 import org.springframework.jms.annotation.JmsListener;
 import org.springframework.stereotype.Component;
 import reactor.util.function.Tuple4;
-import reactor.util.function.Tuples;
 
 import java.text.ParseException;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 @Component
@@ -32,6 +33,7 @@ public class PositionMonitoring {
     public static final String PROTOBUF_SERIALIZATION_TYPE = "protobuf";
     public static final String JSON_SERIALIZATION_TYPE = "json";
     public static final String ACCURACY_FUSION_STRATEGY = "accuracy";
+    public static final String TRACKING_SUFFIX = "_tracking";
     public static final String TOPIC_DOOR = "Human_at_Door_Side";
     public static final String TOPIC_WINDOW = "Human_at_Window_Side";
     public static final String ZONE_ID_DOOR = "cobot1_door_zone";
@@ -49,6 +51,15 @@ public class PositionMonitoring {
         }
     }
 
+    private static eventFilter getEventFilterByIdOrNull(String monitoringTaskId){
+        for (eventFilter eFilter : eventFilters){
+            if (eFilter.getMonitoringTaskId().equals(monitoringTaskId)){
+                return eFilter;
+            }
+        }
+        return null;
+    }
+
     private static void updateLocalizableObject(PositionEvent positionEvent) {
         LocalizableObject lObject = DataServices.getLObjectByIdOrNull(positionEvent.getLObjectId());
 
@@ -58,9 +69,9 @@ public class PositionMonitoring {
         lObject.setCurrentPlacing(positionEvent.getPlacing());
     }
 
-    private MonitoringRequest createMonitoringRequest(String frameId, String monitoringTaskId) {
+    private MonitoringRequest createMonitoringRequest(List<String> frameIds, String monitoringTaskId) {
         MonitoringRequest monReq = modelFactory.createMonitoringRequest();
-        monReq.setFrameId(frameId);
+        monReq.getFrameIds().addAll(frameIds);
         monReq.setMonitoringTaskId(monitoringTaskId);
         return monReq;
     }
@@ -78,13 +89,23 @@ public class PositionMonitoring {
         LOG.info("Received MonitoringRequest <" + monReq + ">");
         eventFilter filter = new eventFilter(monReq);
         EventFilterCondition config = modelFactory.createEventFilterCondition();
+        config.setPositionConditionCells(new HashMap<>());
         if (! readConfig.readFilterConfigFromMonitoringRequest(monReq, config)){
             return; // monitoringRequest could not be read
         }
         filter.init(config);
         eventFilters.add(filter);
-        LOG.info("EventFilter was created: " + filter.toString() + "; monitoringTaskId: " + filter.getMonitoringTaskId() + "; zone-id:" + filter.getFilterConditionConfig().getPositionConditionCellId());
-        // TODO (tracking): init tracking task
+        LOG.info("EventFilter was created: " + filter.toString() + "; monitoringTaskId: " + filter.getMonitoringTaskId() + "; zone-ids:" + filter.getFilterConditionConfig().getPositionConditionCells().keySet());
+
+        /*
+         * trackingTaskId equals MonitoringTaskId + '_tracking' (which equals the name
+         * of the topic used for fetching the stored positions) to be able to
+         * distinguish the monitoring-topic from the tracking-topic. Therefore, the
+         * data should be stored using the altered name. The DataQueryRequest will also
+         * contain the suffix, therefore, we change the suffix here automatically.
+        */
+        String trackingTaskId = monReq.getMonitoringTaskId() + PositionMonitoring.TRACKING_SUFFIX;
+        DataServices.initTrackingTask(trackingTaskId);
     }
 
     private static boolean isDoor = false;
@@ -93,47 +114,252 @@ public class PositionMonitoring {
     private static boolean firstMessage = true;
 
 
+    /**
+     * It is important to find out which zones should be actually reported to the requester
+     * (there may be other zones that overlap the ones that tha requester wanted to monitor or track)
+     * I think, we should make sure that using they key trackingTaskId only those positionEvents should be persisted
+     * that do actually have been accepted by the associated monitoringRequest (so, whose monitoringRequestId equals
+     * the trackingTaskId without "_tracking" at the end)
+     * @param dsQueryRequest
+     */
     public static void receiveMessage(DataStorageQueryRequest dsQueryRequest){
-        // monitoringRequest is not necessary, as the name of the response-topic equals trackingTaskId + 'tracking'
-        // TODO: monitoringRequestId is important to find out which zones should be actually reported to the requester
-        // (there may be other zones that overlap the ones that tha requester wanted to monitor or track)
+        if(! dsQueryRequest.getTrackingTaskId().endsWith(PositionMonitoring.TRACKING_SUFFIX)){
+            LOG.warn("Can not handle QueryRequest due to unexpected trackingTaskId. " +
+                    "TrackingTaskIds shall end with " + PositionMonitoring.TRACKING_SUFFIX);
+            return;
+        }
+        String trackingTaskId = dsQueryRequest.getTrackingTaskId();
         List<PositionEvent> trackedEvents = DataServices.query(dsQueryRequest.getTrackingTaskId());
         DataStorageQueryResponse dsQueryResponse = modelFactory.createDataStorageQueryResponse();
         dsQueryResponse.getPositionEvents().addAll(trackedEvents);
-        SimpleSceneIntegration.receiveMessage(dsQueryResponse, dsQueryRequest.getTrackingTaskId());
+        dsQueryResponse.setTrackingTaskId(trackingTaskId);
+        eventFilter eFilter = getEventFilterFromTrackingTaskId(trackingTaskId);
+        SimpleSceneIntegration.receiveMessage(dsQueryResponse, dsQueryRequest.getTrackingTaskId(), eFilter.getSerializationType());
+    }
+
+    private static eventFilter getEventFilterFromTrackingTaskId(String trackingTaskId) {
+        int lengthMonitoringTaskId = trackingTaskId.length() - PositionMonitoring.TRACKING_SUFFIX.length();
+        String monitoringTaskId = trackingTaskId.substring(0, lengthMonitoringTaskId);
+        eventFilter eFilter = getEventFilterByIdOrNull(monitoringTaskId);
+        return eFilter;
     }
 
     // @JmsListener(destination = "/PositionEvent", containerFactory = "jmsListenFactory")
     public static void receiveMessage(PositionEvent posEvent) {
         // TODO: Update currentPlacing attribute of the affected localizableObject
         LOG.info("Received <" + posEvent + ">");
-        logging_sdf(posEvent);
+        logging_sdfindfro(posEvent);
 
         boolean posEventMeetsSdfAccuracyCondition = SensorDataFusion.isMostAccuratePositionAvailable(posEvent);
         List<Tuple4<PositionEvent, String, String, String>> entryNotifications = new LinkedList<>();
+        List<FilteringResult> filteringResults = new LinkedList<>();
+        Map<String, List<ZoneDescriptor>> eFilterZoneDescriptors = new HashMap<>();
         for (eventFilter eFilter : eventFilters){
-           // TODO (Tracking): inside this loop the zoneDescriptors of the PositionEvent have to be set
-            try {
+           try {
                 if (eFilterMayHandlePosEvent(posEvent, posEventMeetsSdfAccuracyCondition, eFilter)){
-                    applyEfilterToPosEvent(posEvent, entryNotifications, eFilter);
+                    filteringResults.add(applyEfilterToPosEvent(posEvent, entryNotifications, eFilter));
                 }
             } catch (ParseException e) {
-                sendEntryNotifications(entryNotifications);
-                e.printStackTrace();
+               processFilteringResults(posEvent, filteringResults);
+               e.printStackTrace();
                 return;
             }
         }
-        sendEntryNotifications(entryNotifications);
-        // TODO (tracking): after all zoneDescriptors have been added to the positionEvent it has to be persisted using DataServices-class
+        processFilteringResults(posEvent, filteringResults);
+        LOG.info("INDFRO-DEBUG: zonePopulation after processing filtering results: " + zonePopulation.toString());
+    }
+
+    private static void processFilteringResults(PositionEvent posEvent, List<FilteringResult> filteringResults) {
+        Map<String, List<ZoneDescriptor>> eFilterZoneDescriptors = translateResultsIntoZoneDescriptors(filteringResults);;
+        persistPositionEvent(posEvent, eFilterZoneDescriptors);
+        sendPositionEventToRequesters(posEvent, eFilterZoneDescriptors);
+        updateZoneAssociations(posEvent, eFilterZoneDescriptors);
+    }
+
+    /**
+     * Assumption: The PositionEvent posEvent passed the eventFilter whose results are
+     * communicated by the zoneDescriptors.
+     * @param posEvent
+     * @param eFilterZoneDescriptors
+     */
+    private static void sendPositionEventToRequesters(PositionEvent posEvent, Map<String, List<ZoneDescriptor>> eFilterZoneDescriptors) {
+        Set<String> sentAlready = sendExitNotifications(posEvent, eFilterZoneDescriptors);
+        sendOtherMonitoringMessages(posEvent, eFilterZoneDescriptors, sentAlready);
+    }
+
+    private static void sendOtherMonitoringMessages(PositionEvent posEvent, Map<String, List<ZoneDescriptor>> eFilterZoneDescriptors, Set<String> sentAlready) {
+        // TODO: This code duplicates sendExitNotifications()-function
+        Set<String> toBeSent = eFilterZoneDescriptors.keySet().stream().collect(Collectors.toSet());
+        toBeSent.removeAll(sentAlready);
+        for (String monitoringTaskId : toBeSent){
+            List<ZoneDescriptor> zoneDescriptorsEFilterResult = eFilterZoneDescriptors.get(monitoringTaskId);
+            eventFilter eFilter = getEventFilterByIdOrNull(monitoringTaskId);
+            if (eFilter == null){
+                LOG.warn("A monitoringTaskId was passed that is not associated to any known eventFilter");
+                continue;
+            }
+            PositionEvent posEventCopy = createShallowCopyOfPosEvent(posEvent);
+            posEventCopy.getZonedescriptors().addAll(zoneDescriptorsEFilterResult);
+            SimpleSceneIntegration.receiveMessage(posEventCopy, monitoringTaskId, getFirstNotificationTypeOrUndefined(zoneDescriptorsEFilterResult), eFilter.getSerializationType());
+        }
+    }
+
+    private static Set<String> sendExitNotifications(PositionEvent posEvent, Map<String, List<ZoneDescriptor>> eFilterZoneDescriptors) {
+        // TODO: This code duplicates sendOtherNotifications()-function
+        Set<String> sentAlready = new HashSet<>();
+        for (String monitoringTaskId : eFilterZoneDescriptors.keySet()){
+            List<ZoneDescriptor> zoneDescriptorsEFilterResult = eFilterZoneDescriptors.get(monitoringTaskId);
+            eventFilter eFilter = getEventFilterByIdOrNull(monitoringTaskId);
+            if (eFilter == null){
+                LOG.warn("A monitoringTaskId was passed that is not associated to any known eventFilter");
+                continue;
+            }
+            if( containsExitNotification(zoneDescriptorsEFilterResult)){
+                PositionEvent posEventCopy = createShallowCopyOfPosEvent(posEvent);
+                posEventCopy.getZonedescriptors().addAll(zoneDescriptorsEFilterResult);
+                SimpleSceneIntegration.receiveMessage(posEventCopy, monitoringTaskId, getFirstNotificationTypeOrUndefined(zoneDescriptorsEFilterResult), eFilter.getSerializationType());
+                sentAlready.add(monitoringTaskId);
+            }
+        }
+        return sentAlready;
+    }
+
+    private static String getFirstNotificationTypeOrUndefined(List<ZoneDescriptor> zoneDescriptorsEFilterResult) {
+        String firstNotificationType = PositionMonitoring.UNDEFINED_TYPE;
+        if (zoneDescriptorsEFilterResult.size() > 0){
+            firstNotificationType = zoneDescriptorsEFilterResult.get(0).getNotificationType();
+        }
+        return firstNotificationType;
+    }
+
+    private static boolean containsExitNotification(List<ZoneDescriptor> zoneDescriptorsEFilterResult) {
+        for (ZoneDescriptor zoneDescriptor : zoneDescriptorsEFilterResult){
+            if (zoneDescriptor.getNotificationType().equals(PositionMonitoring.EXIT_NOTIFICATION_TYPE)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static void persistPositionEvent(PositionEvent posEvent, Map<String, List<ZoneDescriptor>> eFilterZoneDescriptors) {
+        for (String monitoringTaskId : eFilterZoneDescriptors.keySet()){
+            List<ZoneDescriptor> zoneDescriptorsEFilterResult = eFilterZoneDescriptors.get(monitoringTaskId);
+            PositionEvent posEventCopy = createShallowCopyOfPosEvent(posEvent);
+            posEventCopy.getZonedescriptors().addAll(zoneDescriptorsEFilterResult);
+            DataServices.persist(posEventCopy, monitoringTaskId + PositionMonitoring.TRACKING_SUFFIX);
+        }
+    }
+
+    /**
+     * Creates a shallow copy of the posEvent
+     * @param posEvent
+     * @return
+     */
+    private static PositionEvent createShallowCopyOfPosEvent(PositionEvent posEvent) {
+        PositionEvent posEventShallowCopy = modelFactory.createPositionEvent();
+        posEventShallowCopy.setPlacing(posEvent.getPlacing());
+        posEventShallowCopy.setTimeStamp(posEvent.getTimeStamp());
+        posEventShallowCopy.setLObjectId(posEvent.getLObjectId());
+        return posEventShallowCopy;
+    }
+
+    private static void updateZoneAssociations(PositionEvent posEvent, Map<String, List<ZoneDescriptor>> eFilterZoneDescriptors) {
+        String agentId = DataServices.getAgentForLocalizableObject(posEvent.getLObjectId()).getId();
+        for (String monitoringTaskId  : eFilterZoneDescriptors.keySet()){
+            updateEfilterZoneAssociations(eFilterZoneDescriptors, agentId, monitoringTaskId);
+        }
+
+    }
+
+    private static void updateEfilterZoneAssociations(Map<String, List<ZoneDescriptor>> eFilterZoneDescriptors, String agentId, String monitoringTaskId) {
+        List<ZoneDescriptor> zoneDescriptorsEFilterResult = eFilterZoneDescriptors.get(monitoringTaskId);
+        for (ZoneDescriptor zoneDescriptor : zoneDescriptorsEFilterResult){
+            if (zoneDescriptor.getNotificationType().equals(PositionMonitoring.ENTRY_NOTIFICATION_TYPE)){
+                LOG.info("INDFRO-DEBUG: Associating agent " + agentId + " with zone " + zoneDescriptor.getZoneId());
+                associateAgentWithZone(zoneDescriptor.getZoneId(), agentId);
+            }
+            if (zoneDescriptor.getNotificationType().equals(PositionMonitoring.EXIT_NOTIFICATION_TYPE)){
+                LOG.info("INDFRO-DEBUG: Disassociating agent " + agentId + " from zone " + zoneDescriptor.getZoneId());
+                disassociateAgentFromZone(zoneDescriptor.getZoneId(), agentId);
+            }
+        }
     }
 
-    private static void logging_sdf(PositionEvent posEvent) {
+    /**
+     * ZoneDescriptors are provided for filteringResults that originated in eventFilters
+     * that rejected the event only if those ZoneDescriptors communicate an ExitNotification.
+     * @param filteringResults
+     * @return
+     */
+    private static Map<String, List<ZoneDescriptor>> translateResultsIntoZoneDescriptors(List<FilteringResult> filteringResults) {
+        Map<String, List<ZoneDescriptor>> eFilterzoneDescriptors = new HashMap<>();
+        for (FilteringResult filteringResult : filteringResults){
+            String monitoringTaskId = filteringResult.getMonitoringTaskId();
+            List<ZoneDescriptor> zoneDescriptors = toZoneDescriptors(filteringResult);
+            if (!filteringResult.hasBlockedEvent()) {
+                eFilterzoneDescriptors.put(monitoringTaskId, zoneDescriptors);
+            }else{
+                if (containsExitNotification(zoneDescriptors)){
+                    // send monitoring messages and persist even if the filter rejected the event, as it contains an ExitNotification for a monitored zone
+                    eFilterzoneDescriptors.put(monitoringTaskId, zoneDescriptors);
+                }
+            }
+        }
+        return eFilterzoneDescriptors;
+    }
+
+    private static List<ZoneDescriptor> toZoneDescriptors(FilteringResult filteringResult) {
+        List<ZoneDescriptor> zoneDescriptors = new LinkedList<>();
+        zoneDescriptors.addAll(calcDescriptorsForMatchingZones(filteringResult));
+        zoneDescriptors.addAll(calcDescriptorsForNonMatchingZones(filteringResult));
+        return zoneDescriptors;
+    }
+
+    private static List<ZoneDescriptor> calcDescriptorsForNonMatchingZones(FilteringResult filteringResult) {
+        List<ZoneDescriptor> zoneDescriptors = new LinkedList<>();
+        for (String zoneId : filteringResult.getNonMatchingPositionConditionCellIds()){
+            ZoneDescriptor zoneDescriptor = modelFactory.createZoneDescriptor();
+            zoneDescriptor.setZoneId(zoneId);
+            if(isExitNotification(filteringResult, zoneId)){
+                zoneDescriptor.setNotificationType(PositionMonitoring.EXIT_NOTIFICATION_TYPE);
+                zoneDescriptors.add(zoneDescriptor);
+            }
+        }
+        return zoneDescriptors;
+    }
+
+    private static List<ZoneDescriptor> calcDescriptorsForMatchingZones(FilteringResult filteringResult) {
+        List<ZoneDescriptor> zoneDescriptors = new LinkedList<>();
+        for (String zoneId : filteringResult.getMatchingPositionConditionCellIds()){
+            ZoneDescriptor zoneDescriptor = modelFactory.createZoneDescriptor();
+            zoneDescriptor.setZoneId(zoneId);
+            if(isEntryNotification(filteringResult, zoneId)) {
+                zoneDescriptor.setNotificationType(PositionMonitoring.ENTRY_NOTIFICATION_TYPE);
+            }else {
+                zoneDescriptor.setNotificationType(PositionMonitoring.UNDEFINED_TYPE);
+            }
+            zoneDescriptors.add(zoneDescriptor);
+        }
+        return zoneDescriptors;
+    }
+
+    private static void logging_sdfindfro(PositionEvent posEvent) {
         LocalizableObject lObject = PositionMonitoring.getLObjectByIdOrNull(posEvent.getLObjectId());
+        if (lObject == null){
+            LOG.info("INDFRO: Warning, unknown sensorId was found. Can not log!");
+        }
         String sensorType = lObject.getSensorType();
         String timestamp = posEvent.getTimeStamp();
         String sensorId = posEvent.getLObjectId();
         String agentId = lObject.getAgent().getId();
-        LOG.info("SDF: Received: sensorType: " + sensorType + " timestamp: " + timestamp + " sensorId: " + sensorId + "agentId: " + agentId);
+        LOG.info("SDF: Received: sensorType: " + sensorType + " timestamp: " + timestamp + " sensorId: " + sensorId + " agentId: " + agentId);
+        LOG.info("INDFRO:");
+        LOG.info("INDFRO: Received: sensorType: " + sensorType + "; position: " + logPosition(posEvent) + "; timestamp: " + timestamp + "; sensorId: " + sensorId + "; agentId: " + agentId);
+    }
+
+    private static String logPosition(PositionEvent posEvent) {
+        Point3D point = (Point3D) posEvent.getPlacing().getPosition().getPoint();
+        return "(x: " + point.getX() + ", y: " + point.getY() + ", z: " + point.getZ() + ")";
     }
 
     /**
@@ -150,60 +376,65 @@ public class PositionMonitoring {
         return !sdfIsRelevant || (sdfIsRelevant && posEventMeetsSdfAccuracyCondition);
     }
 
-    private static void applyEfilterToPosEvent(PositionEvent posEvent, List<Tuple4<PositionEvent, String, String, String>> entryNotifications, eventFilter eFilter) throws ParseException {
-        boolean posEventMeetsFilterConditions = !eFilter.process(posEvent);
-        if(posEventMeetsFilterConditions){
+    private static FilteringResult applyEfilterToPosEvent(PositionEvent posEvent, List<Tuple4<PositionEvent, String, String, String>> entryNotifications, eventFilter eFilter) throws ParseException {
+        FilteringResult filteringResult = eFilter.process(posEvent);
+        boolean posEventMeetsFilterConditions = !filteringResult.hasBlockedEvent();
+        if(posEventMeetsFilterConditions) {
             LOG.info(eFilter.getMonitoringTaskId() + "-EventFilter accepted the position");
-            if (isEntryNotification(posEvent, eFilter)) {
+        }
+        return filteringResult;
+        /*
+            posEvent = createAndAppendZoneDescriptors(posEvent, filteringResult);
+
+
+            if (allNotificationsAreEntryNotifications(posEvent)){
+                // hier feststellen ob alle matchingZones EntryNotifications sind
                 entryNotifications.add(Tuples.of(posEvent, eFilter.getMonitoringTaskId(), ENTRY_NOTIFICATION_TYPE, eFilter.getSerializationType())); // note: EntryNotifications are sent after that all ExitNotifications have been sent
-                associateAgentWithZone(eFilter.getFilterConditionConfig().getPositionConditionCellId(), posEvent.getLObjectId());
+                // updateZoneAssociations(eFilter, posEvent);
             }else {
                 SimpleSceneIntegration.receiveMessage(posEvent, eFilter.getMonitoringTaskId(), UNDEFINED_TYPE, eFilter.getSerializationType());
             }
-        }else if (isExitNotification(posEvent, eFilter)){
+        }
+        return filteringResult;
+
+        else if (isExitNotification(posEvent, eFilter)){
             disassociateAgentFromZone(eFilter.getFilterConditionConfig().getPositionConditionCellId(), posEvent.getLObjectId());
             SimpleSceneIntegration.receiveMessage(posEvent, eFilter.getMonitoringTaskId(), EXIT_NOTIFICATION_TYPE, eFilter.getSerializationType()); // note: ExitNotifications are sent immediately
+        */
         }
+
+    private static void updateZoneAssociation(String zoneId, PositionEvent posEvent) {
+        String agentId = DataServices.getAgentForLocalizableObject(posEvent.getLObjectId()).getId();
+        associateAgentWithZone(zoneId, agentId);
     }
 
     /**
-     *     assumption: An object has been found to be located outside of a zone.
-     *     This function determines whether it just exited from that zone
-     *      Function has a side-effect: agentIds are removed from the map zonePopulation
-     * @param posEvent
-     * @param eFilter
+     *     assumption: An object has been found to be located outside of a zone whose id is zoneId.
+     *     This function determines whether it just exited from that zone.
+     * @param filteringResult
+     * @param zoneId
      * @return
      */
-    private static boolean isExitNotification(PositionEvent posEvent, eventFilter eFilter) {
-        String zoneId = eFilter.getFilterConditionConfig().getPositionConditionCellId();
+    private static boolean isExitNotification(FilteringResult filteringResult, String zoneId) {
+        PositionEvent posEvent = filteringResult.getPosEvent();
         String agentId = DataServices.getAgentForLocalizableObject(posEvent.getLObjectId()).getId();
         if(null == zoneId) return false;
-        if (isLocatedInsideZone(zoneId, agentId)){
-            disassociateAgentFromZone(zoneId, agentId);
-            return true;
-        }else{
-            return false;
-        }
+        return isLocatedInsideZone(zoneId, agentId);
     }
 
     /**
-     * Assumption: posEvent contains a position which is located within the zone associated to eFilter.
-     * Function has a side-effect: agentIds are added to the map zonePopulation
-     * @param posEvent
-     * @param eFilter
+     * Assumption: zoneId is the id of a zone that the position (contained in filteringResult)
+     * is actually located in.
+     * @param filteringResult
+     * @param zoneId
      * @return
      */
-    private static boolean isEntryNotification(PositionEvent posEvent, eventFilter eFilter) {
-        String zoneId = eFilter.getFilterConditionConfig().getPositionConditionCellId();
+    private static boolean isEntryNotification(FilteringResult filteringResult, String zoneId) {
+        PositionEvent posEvent = filteringResult.getPosEvent();
         String agentId = DataServices.getAgentForLocalizableObject(posEvent.getLObjectId()).getId();
         LOG.info("zoneId: " + zoneId + "; agentId: " + agentId);
         if(null == zoneId) return false;
-        if (isLocatedInsideZone(zoneId, agentId)){
-            return false;
-        }else{
-            associateAgentWithZone(zoneId, agentId);
-            return true;
-        }
+        return !isLocatedInsideZone(zoneId, agentId); // if the agent was not inside this zone before, it has just entered the zone
     }
 
     private static boolean isLocatedInsideZone(String zoneId, String agentId) {
@@ -216,7 +447,9 @@ public class PositionMonitoring {
 
     private static void associateAgentWithZone(String zoneId, String agentId) {
         if(zonePopulation.keySet().contains(zoneId)){
-            zonePopulation.get(zoneId).add(agentId);
+            if (! zonePopulation.get(zoneId).contains(agentId)){
+                zonePopulation.get(zoneId).add(agentId);
+            }
         }else{
             zonePopulation.put(zoneId, new LinkedList<String>(Arrays.asList(agentId)));
         }
@@ -224,17 +457,10 @@ public class PositionMonitoring {
 
     private static void disassociateAgentFromZone(String zoneId, String agentId) {
         if(zonePopulation.keySet().contains(zoneId)){
-            if (!zonePopulation.get(zoneId).remove(agentId)){
-                LOG.warn("AgentId cannot be removed as it is currently not associated with the given zone");
-            }
+            while(zonePopulation.get(zoneId).remove(agentId)); // remove all occurences
         }else{
             LOG.warn("AgentId cannot be removed as there are currently no AgentIds associated to the zone");
         }
     }
-
-    private static void sendEntryNotifications(List<Tuple4<PositionEvent, String, String, String>> entryNotifications) {
-        for (Tuple4<PositionEvent, String, String, String> entryNotification : entryNotifications){
-            SimpleSceneIntegration.receiveMessage(entryNotification.getT1(), entryNotification.getT2(), entryNotification.getT3(), entryNotification.getT4());
-        }
-    }
 }
+
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 9ba769a5384634476b7347bf8435dde1d52d34d5..517faebecf521f3821ba39de797a502cf99020f2 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -12,8 +12,8 @@ mqtt:
   setKeepAliveInterval: 10
   connectionTimeout: 20
   clientId: ipos.project.fw
-  hostname: 192.168.0.111
-  # hostname: broker.hivemq.com
+  # hostname: 192.168.0.111
+  hostname: broker.hivemq.com
   port: 1883
 
 spring:
diff --git a/testdata_raw.txt b/testdata_raw_empty.txt
similarity index 100%
rename from testdata_raw.txt
rename to testdata_raw_empty.txt
diff --git a/testdata_raw_indfro.txt b/testdata_raw_indfro.txt
new file mode 100644
index 0000000000000000000000000000000000000000..73712114be453211a0c860e9f76d332bd4f9853f
--- /dev/null
+++ b/testdata_raw_indfro.txt
@@ -0,0 +1,6 @@
+{"sensorPositionEvent": [{"sensorId": "UWB_1", "position": {"refSystemId": "ROOT", "point": {"x": 3.0,"y": 1.5,"z": 3.0}, "accuracy": 1.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "lastPosUpdate": "2021-10-14T19:32:20+00:00"}]}
+{"sensorPositionEvent": [{"sensorId": "UWB_1", "position": {"refSystemId": "ROOT", "point": {"x": 3.0,"y": 4.5,"z": 3.0}, "accuracy": 1.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "lastPosUpdate": "2021-10-14T19:32:21+00:00"}]}
+{"sensorPositionEvent": [{"sensorId": "UWB_1", "position": {"refSystemId": "ROOT", "point": {"x": -3.0,"y": 4.5,"z": 3.0}, "accuracy": 1.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "lastPosUpdate": "2021-10-14T19:32:22+00:00"}]}
+{"sensorPositionEvent": [{"sensorId": "UWB_1", "position": {"refSystemId": "ROOT", "point": {"x": 3.0,"y": 1.5,"z": 3.0}, "accuracy": 1.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "lastPosUpdate": "2021-10-14T19:32:23+00:00"}]}
+{"nfcRawDataEvent" : [ {"timestamp" : "2021-10-14T19:33:24+00:00", "tagId": "83221710", "type": "RFID", "scannerId": "98:CD:AC:26:2D:18"} ] }
+{"sensorPositionEvent": [{"sensorId": "UWB_1", "position": {"refSystemId": "ROOT", "point": {"x": 3.0,"y": 1.5,"z": 3.0}, "accuracy": 1.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "lastPosUpdate": "2021-10-14T19:34:25+00:00"}]}
\ No newline at end of file
diff --git a/testdata_raw_query.txt b/testdata_raw_query.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bd86a5a94b1b1b1ff0d7bc5e00a371ecc380ade2
--- /dev/null
+++ b/testdata_raw_query.txt
@@ -0,0 +1 @@
+{"queryRequests":[{"trackingTaskId": "RobolabMonitoringCeti_tracking"}, {"trackingTaskId": "RobolabMonitoringFrontend_tracking"}]}
\ No newline at end of file
diff --git a/testdata_raw_full.txt b/testdata_raw_sdf.txt
similarity index 100%
rename from testdata_raw_full.txt
rename to testdata_raw_sdf.txt