diff --git a/emf_datamodel/model/iPos_Datamodel.aird b/emf_datamodel/model/iPos_Datamodel.aird
index 6cc9afa543b94738765e2262b2b9f739498f0012..3b55cb5b7e207f87639f402db7e6486ef46de5a2 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="de9b3043-b6a3-4d89-afc7-963d67701d45">
+      <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_Et4wgAQNEey-kNQ7esRa_g" name="iPos_Datamodel" repPath="#_Es-xkAQNEey-kNQ7esRa_g" changeId="9e1b7476-c4ed-4af9-bf42-c1e58844c8c1">
         <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>
@@ -709,6 +709,10 @@
               <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>
@@ -2250,7 +2254,7 @@
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
       <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
       <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
-      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_qwXFihvcEeyPOIo-WqURQQ" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
+      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_ZchbXyBzEeyaJIyxidrtuQ" 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']"/>
@@ -2262,9 +2266,9 @@
         </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="_onxBUBvcEeyPOIo-WqURQQ" name="sensorId : EString" tooltipText="">
-        <target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//PositionEvent/sensorId"/>
-        <semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//PositionEvent/sensorId"/>
+      <ownedElements xmi:type="diagram:DNodeListElement" uid="_onxBUBvcEeyPOIo-WqURQQ" name="lObjectId : EString" tooltipText="">
+        <target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//PositionEvent/lObjectId"/>
+        <semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//PositionEvent/lObjectId"/>
         <ownedStyle xmi:type="diagram:BundledImage" uid="_qwZhwRvcEeyPOIo-WqURQQ" 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>
@@ -2762,7 +2766,7 @@
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
       <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
       <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
-      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_NzPucRr2EeyPOIo-WqURQQ" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
+      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_GrDD1SB0EeyaJIyxidrtuQ" 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']"/>
@@ -2800,7 +2804,7 @@
       <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
       <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
       <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
-      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_l8_WqR_NEeyaJIyxidrtuQ" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
+      <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_yc1iBSHPEeynrdmghnL28w" 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']"/>
@@ -2884,6 +2888,14 @@
         </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"/>
diff --git a/emf_datamodel/model/iPos_Datamodel.ecore b/emf_datamodel/model/iPos_Datamodel.ecore
index f77db0cd0f2356def153cc681bd32a3ea438bec2..c52f2a43b1630c4f375980c943bd145a8503d1a6 100644
--- a/emf_datamodel/model/iPos_Datamodel.ecore
+++ b/emf_datamodel/model/iPos_Datamodel.ecore
@@ -119,7 +119,7 @@
         eType="#//Placing"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="timeStamp" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
         transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sensorId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lObjectId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="RawdataEvent">
     <eStructuralFeatures xsi:type="ecore:EReference" name="rawdata" lowerBound="1"
@@ -235,6 +235,8 @@
         eType="#//FloatArray3d"/>
     <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[]>"/>
diff --git a/emf_datamodel/model/iPos_Datamodel.genmodel b/emf_datamodel/model/iPos_Datamodel.genmodel
index 1b9e4b44f00fc48dce02e561b6479f714866c741..18b60791953fd6f6a293ba85eba4b38515dae812 100644
--- a/emf_datamodel/model/iPos_Datamodel.genmodel
+++ b/emf_datamodel/model/iPos_Datamodel.genmodel
@@ -110,7 +110,7 @@
     <genClasses ecoreClass="iPos_Datamodel.ecore#//PositionEvent">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iPos_Datamodel.ecore#//PositionEvent/placing"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//PositionEvent/timeStamp"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//PositionEvent/sensorId"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//PositionEvent/lObjectId"/>
     </genClasses>
     <genClasses ecoreClass="iPos_Datamodel.ecore#//RawdataEvent">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference iPos_Datamodel.ecore#//RawdataEvent/rawdata"/>
@@ -179,6 +179,7 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCell"/>
       <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>
   </genPackages>
 </genmodel:GenModel>
diff --git a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/SimpleSceneIntegration.java b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/SimpleSceneIntegration.java
index 40987e405162ae3ecd93aa538727dfa9bd5f8f4d..bd3fb8a634c9c7b42301a63e8a0428275146d0bb 100644
--- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/SimpleSceneIntegration.java
+++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/SimpleSceneIntegration.java
@@ -1,18 +1,19 @@
 package ipos.project.DataModellntegration.SimpleSceneIntegration;
 
-import ipos.models.SimpleScene.IposPosition;
+import ipos.models.SimpleScene;
+import ipos.project.DataModellntegration.SimpleSceneIntegration.service.SimpleSceneTransformer;
 import ipos.project.DataModellntegration.SimpleSceneIntegration.service.impl.ExternalPubServiceImpl;
 import ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent;
 import ipos.project.mapper.ProtoJsonMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.jms.annotation.JmsListener;
 import org.springframework.stereotype.Component;
 
 @Component
 public class SimpleSceneIntegration {
-    private final Logger LOG = LoggerFactory.getLogger(getClass());
+    // private static final Logger LOG = LoggerFactory.getLogger(SimpleSceneIntegration.class);
+    private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
 
     //@Autowired
     public static ExternalPubServiceImpl mqttService;
@@ -33,23 +34,22 @@ public class SimpleSceneIntegration {
         }
     }*/
 
-    public static void receiveMessage(PositionEvent positionEvent, String monitoringTaskId) {
-        // LOG.trace("Data integration get: " + pos);
-        System.out.println("SimpleSceneIntegration: Data integration get: " + positionEvent);
-        // we can translate a class into a string using several methods: 1) `.toString()` 2) `JsonFormat` in `ProtoJsonMap`
-        //String jsonPos = ProtoJsonMap.toJson(positionEvent);
-        // TODO: Transform Internal-PositionEvent to Protobuf-SensorPositionEvent
+    public static void receiveMessage(PositionEvent positionEvent, String monitoringTaskId, String type) {
+        // LOG.info("receiveMessage get: " + positionEvent);
+        //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) {
-            System.out.println("SimpleSceneIntegration: mqtt-message will be published: monitoringTaskId: " + monitoringTaskId + " positionEvent: " + positionEvent.toString());
-
-            if (null == mqttService) {
-                System.out.println("Warning: SimpleSceneIntegration: mqttService is null");
-            }
-            // getsensorId, load sensor-type, agent-type, agent-id and create IposPositionEvent
-            // SimpleSceneTransformer.posEvent_internal2Proto();
-            mqttService.publish(monitoringTaskId, positionEvent.toString(), 0, false);
+           // LOG.info("received internal-positionEvent: monitoringTaskId: " + monitoringTaskId + " positionEvent: " + positionEvent.toString());
+            SimpleScene.IposPositionEvent posEvent_proto = SimpleSceneTransformer.posEvent_internal2Proto(positionEvent, type);
+           // LOG.info("obtained protobuf-positionEvent:" + posEvent_proto.toString());
+            MqttMessage mqttMessage = mqttService.createMqttMsg(posEvent_proto, 0, false);
+
+            // Protobuf-Versand: LOG.info("publishing mqttMessage:" + mqttMessage.toString() + " on topic: " + monitoringTaskId);
+            // mqttService.publish(monitoringTaskId, mqttMessage);
+
+            LOG.info("publishing mqttMessage:" + ProtoJsonMap.toJson(posEvent_proto) + " on topic: " + monitoringTaskId);
+            mqttService.publish(monitoringTaskId, ProtoJsonMap.toJson(posEvent_proto), 0, false);
         }else{
-            System.out.println("Warning: SimpleScene: Received empty PositionEvent");
+            LOG.warn("Warning: SimpleScene: Received empty PositionEvent");
         }
     }
 
diff --git a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/ExternalPubService.java b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/ExternalPubService.java
index 48c7aee093607dc090a26728ca44feae076836e0..69cb4a98491f5cb52180eb72ca47c27e415cef60 100644
--- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/ExternalPubService.java
+++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/ExternalPubService.java
@@ -1,5 +1,9 @@
 package ipos.project.DataModellntegration.SimpleSceneIntegration.service;
 
+import com.google.protobuf.AbstractMessageLite;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+
 public interface ExternalPubService {
     void publish(final String topic, final String msg , int qos, boolean retained);
+    MqttMessage createMqttMsg(AbstractMessageLite message, int qos, boolean retained);
 }
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 1924476217ce2c45e6b35e561506774d494471e8..1003df2905c5a6fdfdc0e6446754817d099d83e6 100644
--- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java
+++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java
@@ -1,15 +1,16 @@
 package ipos.project.DataModellntegration.SimpleSceneIntegration.service;
 
 import ipos.models.SimpleScene;
-import ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelFactory;
-import ipos.project.DataModellntegration.iPos_Datamodel.MonitoringRequest;
+import ipos.project.DataModellntegration.iPos_Datamodel.*;
 import com.google.protobuf.ProtocolStringList;
+import ipos.project.UseCaseController.PositionMonitoring;
+import org.apache.logging.log4j.LogManager;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public class SimpleSceneTransformer {
-
+    private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
     private static IPos_DatamodelFactory modelFactory = IPos_DatamodelFactory.eINSTANCE;
 
     public static MonitoringRequest monReq_SScene2Internal(SimpleScene.IposMonitoringRequest monReqProto){
@@ -39,4 +40,56 @@ public class SimpleSceneTransformer {
         return null;
     }
 
+    public static SimpleScene.IposPositionEvent posEvent_internal2Proto(PositionEvent internalPosEvent, String type){
+        LocalizableObject lObject = PositionMonitoring.getLObjectByIdOrNull(internalPosEvent.getLObjectId());
+        if (null == lObject || null == lObject.getAgent()) {
+            LOG.error("Internal-PositionEvent could not be transformed into protobuf-format. " +
+                    "No LocalizableObject with the provided sensor-id could be found, or no agent " +
+                    "is associated to the LocalizableObject that has been found.");
+            return null;
+        }
+        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, type, lObject, protoIposPosition, protoOrientation);
+        SimpleScene.IposPositionEvent.Builder protoIposPosEvent = transformIntoProtoIposPosEvent(type, protoIposObject);
+        return protoIposPosEvent.build();
+    }
+
+    private static SimpleScene.IposPositionEvent.Builder transformIntoProtoIposPosEvent(String type, SimpleScene.IposObject.Builder protoIposObject) {
+        SimpleScene.IposPositionEvent.Builder protoIposPosEvent = SimpleScene.IposPositionEvent.newBuilder();
+        if (!PositionMonitoring.UNDEFINED_TYPE.equals(type)) { // if undefined, protobuf-object will be created without explicit type-information
+            protoIposPosEvent.setType(type);
+        }
+        protoIposPosEvent.addObject(protoIposObject);
+        return protoIposPosEvent;
+    }
+
+    private static SimpleScene.IposObject.Builder transformIntoProtoObject(PositionEvent internalPosEvent, String type, LocalizableObject lObject, SimpleScene.IposPosition.Builder protoIposPosition, SimpleScene.IposSimpleOrientation.Builder protoOrientation) {
+        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());
+        return protoIposObject;
+    }
+
+    private static SimpleScene.IposSimpleOrientation.Builder transformIntoProtoOrientation(PositionEvent internalPosEvent) {
+        SimpleScene.IposSimpleOrientation.Builder protoOrientation = SimpleScene.IposSimpleOrientation.newBuilder();
+        Quaternion internalOrientation = (Quaternion) internalPosEvent.getPlacing().getOrientation();
+        protoOrientation.setX(internalOrientation.getX()).setY(internalOrientation.getY()).setZ(internalOrientation.getZ()).setW(internalOrientation.getW());
+        return protoOrientation;
+    }
+
+    private static SimpleScene.IposPosition.Builder transformIntoProtoIposPosition(PositionEvent internalPosEvent, SimpleScene.IposPoint3D.Builder protoPoint3D) {
+        float internalAccuracy = ((Gaussian) internalPosEvent.getPlacing().getPosition().getAccuracy()).getConfidenceInterval();
+        String internalRefSystemId = internalPosEvent.getPlacing().getPosition().getReferenceSystem().getId();
+        SimpleScene.IposPosition.Builder protoIposPosition = SimpleScene.IposPosition.newBuilder();
+        protoIposPosition.setAccuracy(internalAccuracy).setRefSystemId(internalRefSystemId).setPoint(protoPoint3D);
+        return protoIposPosition;
+    }
+
+    private static SimpleScene.IposPoint3D.Builder transformIntoProtoPoint3D(PositionEvent internalPosEvent) {
+        SimpleScene.IposPoint3D.Builder protoPoint3D = SimpleScene.IposPoint3D.newBuilder();
+        Point3D internalPoint3D = (Point3D) internalPosEvent.getPlacing().getPosition().getPoint();
+        protoPoint3D.setX(internalPoint3D.getX()).setY(internalPoint3D.getY()).setZ(internalPoint3D.getZ());
+        return protoPoint3D;
+    }
 }
diff --git a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/impl/ExternalPubServiceImpl.java b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/impl/ExternalPubServiceImpl.java
index 1269b262ffd3d91de504be2aa8a4760e03f46a94..2a9c6a75de3515e879b98c88177a14ab15d0fddb 100644
--- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/impl/ExternalPubServiceImpl.java
+++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/impl/ExternalPubServiceImpl.java
@@ -1,15 +1,22 @@
 package ipos.project.DataModellntegration.SimpleSceneIntegration.service.impl;
 
+import com.google.protobuf.AbstractMessageLite;
 import ipos.project.DataModellntegration.SimpleSceneIntegration.service.ExternalPubService;
 import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
 import org.eclipse.paho.client.mqttv3.MqttException;
 import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
 @Service
 public class ExternalPubServiceImpl implements ExternalPubService {
 
+    private final Logger LOG = LoggerFactory.getLogger(getClass());
     private final MqttAsyncClient mqttClient;
 
     @Autowired
@@ -22,11 +29,30 @@ public class ExternalPubServiceImpl implements ExternalPubService {
         mqttMessage.setPayload(msg.getBytes());
         mqttMessage.setQos(qos);
         mqttMessage.setRetained(retained);
+        publish(topic, mqttMessage);
+    }
 
+    public void publish(final String topic, final MqttMessage mqttMessage){
         try {
             mqttClient.publish(topic, mqttMessage);
         } catch (MqttException e) {
+            LOG.error("MQTT-message could not be published");
             e.printStackTrace();
         }
     }
+
+    @Override
+    public MqttMessage createMqttMsg(AbstractMessageLite protoMessage, int qos, boolean retained) {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            protoMessage.writeTo(baos);
+        } catch (IOException e) {
+            LOG.error("Protobuf-message could not be serialized");
+            e.printStackTrace();
+        }
+        MqttMessage mqttMessage = new MqttMessage(baos.toByteArray());
+        mqttMessage.setQos(qos);
+        mqttMessage.setRetained(retained);
+        return mqttMessage;
+    }
 }
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 873e353f53a3c20815d13640638dad094b88628c..46e45613301030759a01d78e3f3c833a210b1422 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java
@@ -26,6 +26,7 @@ import org.eclipse.emf.ecore.EObject;
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCell <em>Position Condition Cell</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()
@@ -253,4 +254,26 @@ 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 f3913e5bc6e45073c062644fddc7c06291151196..9584236628340a4d6f02cfca00454e7ffc68c09c 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
@@ -1346,13 +1346,13 @@ public interface IPos_DatamodelPackage extends EPackage {
 	int POSITION_EVENT__TIME_STAMP = 1;
 
 	/**
-	 * The feature id for the '<em><b>Sensor Id</b></em>' attribute.
+	 * The feature id for the '<em><b>LObject Id</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int POSITION_EVENT__SENSOR_ID = 2;
+	int POSITION_EVENT__LOBJECT_ID = 2;
 
 	/**
 	 * The number of structural features of the '<em>Position Event</em>' class.
@@ -2400,6 +2400,15 @@ 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 -->
@@ -2407,7 +2416,7 @@ public interface IPos_DatamodelPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int EVENT_FILTER_CONDITION_FEATURE_COUNT = 10;
+	int EVENT_FILTER_CONDITION_FEATURE_COUNT = 11;
 
 	/**
 	 * The number of operations of the '<em>Event Filter Condition</em>' class.
@@ -3263,15 +3272,15 @@ public interface IPos_DatamodelPackage extends EPackage {
 	EAttribute getPositionEvent_TimeStamp();
 
 	/**
-	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent#getSensorId <em>Sensor Id</em>}'.
+	 * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent#getLObjectId <em>LObject Id</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Sensor Id</em>'.
-	 * @see ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent#getSensorId()
+	 * @return the meta object for the attribute '<em>LObject Id</em>'.
+	 * @see ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent#getLObjectId()
 	 * @see #getPositionEvent()
 	 * @generated
 	 */
-	EAttribute getPositionEvent_SensorId();
+	EAttribute getPositionEvent_LObjectId();
 
 	/**
 	 * Returns the meta object for class '{@link ipos.project.DataModellntegration.iPos_Datamodel.RawdataEvent <em>Rawdata Event</em>}'.
@@ -3880,6 +3889,17 @@ 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 data type '{@link java.util.List <em>String List</em>}'.
 	 * <!-- begin-user-doc -->
@@ -4609,12 +4629,12 @@ public interface IPos_DatamodelPackage extends EPackage {
 		EAttribute POSITION_EVENT__TIME_STAMP = eINSTANCE.getPositionEvent_TimeStamp();
 
 		/**
-		 * The meta object literal for the '<em><b>Sensor Id</b></em>' attribute feature.
+		 * The meta object literal for the '<em><b>LObject Id</b></em>' attribute feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EAttribute POSITION_EVENT__SENSOR_ID = eINSTANCE.getPositionEvent_SensorId();
+		EAttribute POSITION_EVENT__LOBJECT_ID = eINSTANCE.getPositionEvent_LObjectId();
 
 		/**
 		 * The meta object literal for the '{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.RawdataEventImpl <em>Rawdata Event</em>}' class.
@@ -5116,6 +5136,15 @@ 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 '<em>String List</em>' data type.
 		 * <!-- begin-user-doc -->
diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/PositionEvent.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/PositionEvent.java
index b57f1c722fdd51f7173b7b260f1b51c66a6d21c2..1df2c2abfb76bdac48e4c289d81f48ed8bbbb436 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/PositionEvent.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/PositionEvent.java
@@ -15,7 +15,7 @@ import org.eclipse.emf.ecore.EObject;
  * <ul>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent#getPlacing <em>Placing</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent#getTimeStamp <em>Time Stamp</em>}</li>
- *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent#getSensorId <em>Sensor Id</em>}</li>
+ *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent#getLObjectId <em>LObject Id</em>}</li>
  * </ul>
  *
  * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getPositionEvent()
@@ -68,25 +68,25 @@ public interface PositionEvent extends EObject {
 	void setTimeStamp(String value);
 
 	/**
-	 * Returns the value of the '<em><b>Sensor Id</b></em>' attribute.
+	 * Returns the value of the '<em><b>LObject Id</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Sensor Id</em>' attribute.
-	 * @see #setSensorId(String)
-	 * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getPositionEvent_SensorId()
+	 * @return the value of the '<em>LObject Id</em>' attribute.
+	 * @see #setLObjectId(String)
+	 * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getPositionEvent_LObjectId()
 	 * @model
 	 * @generated
 	 */
-	String getSensorId();
+	String getLObjectId();
 
 	/**
-	 * Sets the value of the '{@link ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent#getSensorId <em>Sensor Id</em>}' attribute.
+	 * Sets the value of the '{@link ipos.project.DataModellntegration.iPos_Datamodel.PositionEvent#getLObjectId <em>LObject Id</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Sensor Id</em>' attribute.
-	 * @see #getSensorId()
+	 * @param value the new value of the '<em>LObject Id</em>' attribute.
+	 * @see #getLObjectId()
 	 * @generated
 	 */
-	void setSensorId(String value);
+	void setLObjectId(String value);
 
 } // PositionEvent
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 28bae6c07777838ddece605b19e99e8e782666ff..7d28c6e1e1fe608c77d104f4114fb6489aca288f 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
@@ -33,6 +33,7 @@ import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
  *   <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#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
@@ -238,6 +239,26 @@ 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 -->
@@ -484,6 +505,29 @@ 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 -->
@@ -512,6 +556,8 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 			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);
 	}
@@ -555,6 +601,9 @@ 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);
 	}
@@ -597,6 +646,9 @@ 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);
 	}
@@ -635,6 +687,9 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		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);
 	}
@@ -670,6 +725,8 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple
 		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 5d8b8e12511982bfdd736e45f59a8a7811271473..ff856f8b09db1811b63ca6be2afe9566b6c9d48e 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
@@ -1179,7 +1179,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getPositionEvent_SensorId() {
+	public EAttribute getPositionEvent_LObjectId() {
 		return (EAttribute) positionEventEClass.getEStructuralFeatures().get(2);
 	}
 
@@ -1696,6 +1696,15 @@ 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 -->
@@ -1871,7 +1880,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		positionEventEClass = createEClass(POSITION_EVENT);
 		createEReference(positionEventEClass, POSITION_EVENT__PLACING);
 		createEAttribute(positionEventEClass, POSITION_EVENT__TIME_STAMP);
-		createEAttribute(positionEventEClass, POSITION_EVENT__SENSOR_ID);
+		createEAttribute(positionEventEClass, POSITION_EVENT__LOBJECT_ID);
 
 		rawdataEventEClass = createEClass(RAWDATA_EVENT);
 		createEReference(rawdataEventEClass, RAWDATA_EVENT__RAWDATA);
@@ -1949,6 +1958,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL);
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__ID_CONDITION);
 		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__CATEGORY_CONDITION);
+		createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__POSITION_CONDITION_CELL_ID);
 
 		// Create data types
 		stringListEDataType = createEDataType(STRING_LIST);
@@ -2209,7 +2219,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		initEAttribute(getPositionEvent_TimeStamp(), theXMLTypePackage.getString(), "timeStamp", null, 0, 1,
 				PositionEvent.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
 				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPositionEvent_SensorId(), ecorePackage.getEString(), "sensorId", null, 0, 1,
+		initEAttribute(getPositionEvent_LObjectId(), ecorePackage.getEString(), "lObjectId", null, 0, 1,
 				PositionEvent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
 				!IS_DERIVED, IS_ORDERED);
 
@@ -2407,6 +2417,9 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data
 		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);
 
 		// 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/PositionEventImpl.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/PositionEventImpl.java
index e837053b1e58191a683842eae7ed997f1495192e..9d25ef8f3cf84fd84cf35c801f9eb6f1a32ed879 100644
--- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/PositionEventImpl.java
+++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/PositionEventImpl.java
@@ -24,7 +24,7 @@ import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
  * <ul>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.PositionEventImpl#getPlacing <em>Placing</em>}</li>
  *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.PositionEventImpl#getTimeStamp <em>Time Stamp</em>}</li>
- *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.PositionEventImpl#getSensorId <em>Sensor Id</em>}</li>
+ *   <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.PositionEventImpl#getLObjectId <em>LObject Id</em>}</li>
  * </ul>
  *
  * @generated
@@ -61,24 +61,24 @@ public class PositionEventImpl extends MinimalEObjectImpl.Container implements P
 	protected String timeStamp = TIME_STAMP_EDEFAULT;
 
 	/**
-	 * The default value of the '{@link #getSensorId() <em>Sensor Id</em>}' attribute.
+	 * The default value of the '{@link #getLObjectId() <em>LObject Id</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getSensorId()
+	 * @see #getLObjectId()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final String SENSOR_ID_EDEFAULT = null;
+	protected static final String LOBJECT_ID_EDEFAULT = null;
 
 	/**
-	 * The cached value of the '{@link #getSensorId() <em>Sensor Id</em>}' attribute.
+	 * The cached value of the '{@link #getLObjectId() <em>LObject Id</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getSensorId()
+	 * @see #getLObjectId()
 	 * @generated
 	 * @ordered
 	 */
-	protected String sensorId = SENSOR_ID_EDEFAULT;
+	protected String lObjectId = LOBJECT_ID_EDEFAULT;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -166,8 +166,8 @@ public class PositionEventImpl extends MinimalEObjectImpl.Container implements P
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public String getSensorId() {
-		return sensorId;
+	public String getLObjectId() {
+		return lObjectId;
 	}
 
 	/**
@@ -175,12 +175,12 @@ public class PositionEventImpl extends MinimalEObjectImpl.Container implements P
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setSensorId(String newSensorId) {
-		String oldSensorId = sensorId;
-		sensorId = newSensorId;
+	public void setLObjectId(String newLObjectId) {
+		String oldLObjectId = lObjectId;
+		lObjectId = newLObjectId;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, IPos_DatamodelPackage.POSITION_EVENT__SENSOR_ID,
-					oldSensorId, sensorId));
+			eNotify(new ENotificationImpl(this, Notification.SET, IPos_DatamodelPackage.POSITION_EVENT__LOBJECT_ID,
+					oldLObjectId, lObjectId));
 	}
 
 	/**
@@ -197,8 +197,8 @@ public class PositionEventImpl extends MinimalEObjectImpl.Container implements P
 			return basicGetPlacing();
 		case IPos_DatamodelPackage.POSITION_EVENT__TIME_STAMP:
 			return getTimeStamp();
-		case IPos_DatamodelPackage.POSITION_EVENT__SENSOR_ID:
-			return getSensorId();
+		case IPos_DatamodelPackage.POSITION_EVENT__LOBJECT_ID:
+			return getLObjectId();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -217,8 +217,8 @@ public class PositionEventImpl extends MinimalEObjectImpl.Container implements P
 		case IPos_DatamodelPackage.POSITION_EVENT__TIME_STAMP:
 			setTimeStamp((String) newValue);
 			return;
-		case IPos_DatamodelPackage.POSITION_EVENT__SENSOR_ID:
-			setSensorId((String) newValue);
+		case IPos_DatamodelPackage.POSITION_EVENT__LOBJECT_ID:
+			setLObjectId((String) newValue);
 			return;
 		}
 		super.eSet(featureID, newValue);
@@ -238,8 +238,8 @@ public class PositionEventImpl extends MinimalEObjectImpl.Container implements P
 		case IPos_DatamodelPackage.POSITION_EVENT__TIME_STAMP:
 			setTimeStamp(TIME_STAMP_EDEFAULT);
 			return;
-		case IPos_DatamodelPackage.POSITION_EVENT__SENSOR_ID:
-			setSensorId(SENSOR_ID_EDEFAULT);
+		case IPos_DatamodelPackage.POSITION_EVENT__LOBJECT_ID:
+			setLObjectId(LOBJECT_ID_EDEFAULT);
 			return;
 		}
 		super.eUnset(featureID);
@@ -257,8 +257,8 @@ public class PositionEventImpl extends MinimalEObjectImpl.Container implements P
 			return placing != null;
 		case IPos_DatamodelPackage.POSITION_EVENT__TIME_STAMP:
 			return TIME_STAMP_EDEFAULT == null ? timeStamp != null : !TIME_STAMP_EDEFAULT.equals(timeStamp);
-		case IPos_DatamodelPackage.POSITION_EVENT__SENSOR_ID:
-			return SENSOR_ID_EDEFAULT == null ? sensorId != null : !SENSOR_ID_EDEFAULT.equals(sensorId);
+		case IPos_DatamodelPackage.POSITION_EVENT__LOBJECT_ID:
+			return LOBJECT_ID_EDEFAULT == null ? lObjectId != null : !LOBJECT_ID_EDEFAULT.equals(lObjectId);
 		}
 		return super.eIsSet(featureID);
 	}
@@ -276,8 +276,8 @@ public class PositionEventImpl extends MinimalEObjectImpl.Container implements P
 		StringBuilder result = new StringBuilder(super.toString());
 		result.append(" (timeStamp: ");
 		result.append(timeStamp);
-		result.append(", sensorId: ");
-		result.append(sensorId);
+		result.append(", lObjectId: ");
+		result.append(lObjectId);
 		result.append(')');
 		return result.toString();
 	}
diff --git a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
index 04aa859041ec1b3052e2ceb421d1f01d4f6103a2..25de2384963e4c57789ecbab2ce9dcaaa8200b52 100644
--- a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
+++ b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java
@@ -46,6 +46,10 @@ public class eventFilter {
     //Conditions: unique conditions are defined as single values, Parallel conditions are defined in lists.
     //initial value: 0 (for float and int) and empty (for arrays), it's not always possible to determine the status of the filter with just the condition value, so a filterStructure is defined to register which conditions are active.
 
+    public EventFilterCondition getFilterConditionConfig() {
+        return filterConditionConfig;
+    }
+
     private ArrayList<String[]> timeCondition;
     private List<String> categoryCondition;
     private List<String> sensorIdCondition;
@@ -55,6 +59,7 @@ public class eventFilter {
     private int timeMinInterval;
     private float positionDelta;
     private ArrayList<Float[][]> positionConditionCell;
+    private EventFilterCondition filterConditionConfig;
 
     public void init(EventFilterCondition conf) {
         filterStructure = conf.getFilterStructure();
@@ -67,6 +72,7 @@ public class eventFilter {
         timeMinInterval = conf.getTimeMinInterval();
         positionDelta = conf.getPositionDelta();
         positionConditionCell = conf.getPositionConditionCell();
+        this.filterConditionConfig = conf;
     }
 
     private static String createRegexFromGlob(String glob) {
@@ -103,14 +109,14 @@ public class eventFilter {
 
     public boolean process(PositionEvent event) throws ParseException {
         IPos_DatamodelFactory dataModelFactory = IPos_DatamodelFactory.eINSTANCE;
-        LocalizableObject lObject = getLObjectBySensorIdOrNull(event.getSensorId());
+        LocalizableObject lObject = getLObjectBySensorIdOrNull(event.getLObjectId());
         boolean flag = false; //false for pass, true for block
         if (null == event.getPlacing() || null == event.getPlacing().getPosition() || null == event.getPlacing().getPosition().getPoint()){
-            System.out.println("EventFilter: Warning: Received event with unknown Position. Sensor-id: " + event.getSensorId());
+            System.out.println("EventFilter: Warning: Received event with unknown Position. Sensor-id: " + event.getLObjectId());
             return true;
         }
         if (null == lObject){
-            System.out.println("EventFilter: Warning: Received event from sensor with unknown sensor-id: " + event.getSensorId());
+            System.out.println("EventFilter: Warning: Received event from sensor with unknown sensor-id: " + event.getLObjectId());
             return true;
         }
         Agent agent = lObject.getAgent();
diff --git a/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java b/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java
index 027151fb9b9c4e9cc635c09648ee991db76062f7..d93a535ccfed1f0226f1e7c1ff73af3b0bb70fc0 100644
--- a/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java
+++ b/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java
@@ -1,9 +1,9 @@
 package ipos.project.Functionality.eventfilter;
 import ipos.project.DataModellntegration.iPos_Datamodel.*;
+import org.apache.logging.log4j.LogManager;
 import org.json.JSONArray;
 import org.json.JSONObject;
 
-import javax.xml.stream.EventFilter;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -13,15 +13,28 @@ public class readConfig {
 
     // kommt später raus, Zugriff auf Weltmodell erfolgt eigentlich über Komponente DataRetrieval
     private static WorldModel wm;
+    private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
 
-    public static void readFilterConfigFromMonitoringRequest (MonitoringRequest monReq, EventFilterCondition config){
-        // TODO: support other criteria than "position_delta" and "position_condition_cell" aus config-file
-        float delta_monReq = monReq.getDelta();
+    /**
+     * Returns false if MonitoringRequest could not be read successfully.
+     * @param monReq
+     * @param config
+     * @return
+     */
+    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 = retrieveZone(frameId_monReq);
-        config.setFilterStructure(new boolean[] {false, false, false, false, false, false, false, true, true});
-        config.setPositionDelta(delta_monReq);
+        Zone zone_monReq = retrieveZoneOrNull(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());
+        return true;
     }
 
     public static ArrayList<Float[][]> transformZone2PositionConditionCell(Zone zone) {
@@ -39,7 +52,7 @@ public class readConfig {
         return position_condition_cell;
     }
 
-    private static Zone retrieveZone(String zoneId){
+    private static Zone retrieveZoneOrNull(String zoneId){
         List<Zone> knownZones = wm.getZoneMap().get(0).getZone();
         for (var zone : knownZones){
             if(zone.getId().equals(zoneId)){
diff --git a/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java b/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java
index 36fd606813a5c2c08de8d497d8cc4cfc029b2089..1154f1923f5c52e3aed627698644b5f58a863299 100644
--- a/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java
+++ b/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java
@@ -3,15 +3,14 @@ package ipos.project.SensorValueIntegration;
 import ipos.models.SimpleScene.IposPosition;
 import ipos.project.DataModellntegration.SimpleSceneIntegration.service.impl.ExternalPubServiceImpl;
 import ipos.project.mapper.ProtoJsonMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.logging.log4j.LogManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jms.annotation.JmsListener;
 import org.springframework.stereotype.Component;
 
 @Component
 public class GenericSensorValueProcessor {
-    private final Logger LOG = LoggerFactory.getLogger(getClass());
+    private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
 
     @Autowired
     private ExternalPubServiceImpl mqttService;
diff --git a/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java b/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java
index f3c87c964fbb4498fef17a81c618cb64f896b463..b2179657ea1b1e8f6259d171f0ac2586ab85107f 100644
--- a/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java
+++ b/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java
@@ -27,7 +27,7 @@ public class GenericSensorTransformer {
     public static PositionEvent posEvent_GSensor2Internal(GenericSensor.SensorPositionEvent protoSensPosEvent) {
         PositionEvent positionEvent = modelFactory.createPositionEvent();
         positionEvent.setTimeStamp(protoSensPosEvent.getLastPosUpdate());
-        positionEvent.setSensorId(protoSensPosEvent.getSensorId());
+        positionEvent.setLObjectId(protoSensPosEvent.getSensorId());
 
         // TODO: Zugriff auf Weltmodell ermöglichen um Bezugssystem-Objekt beschaffen zu können
         positionEvent.setPlacing(
diff --git a/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java b/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java
index a0326b2c28f5df4621c0d4056e52bf85f1ef6420..3a38e64fe0cb1f6dbabca1f8bbf7439f22765e5a 100644
--- a/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java
+++ b/src/main/java/ipos/project/SensorValueIntegration/api/MqttPositionHandler.java
@@ -11,9 +11,8 @@ import ipos.project.UseCaseController.PositionMonitoring;
 import ipos.project.config.mqtt.Handler;
 import ipos.project.config.mqtt.MqttListener;
 import ipos.project.mapper.ProtoJsonMap;
+import org.apache.logging.log4j.LogManager;
 import org.eclipse.paho.client.mqttv3.MqttMessage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jms.core.JmsTemplate;
 
@@ -22,7 +21,7 @@ import org.springframework.jms.core.JmsTemplate;
 @MqttListener("usertopic/SensorPositionEvent")
 public class MqttPositionHandler implements Handler {
 
-    private final Logger LOG = LoggerFactory.getLogger(getClass());
+    private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
     JmsTemplate jmsTemplate;
 
     @Autowired
@@ -36,25 +35,12 @@ public class MqttPositionHandler implements Handler {
     // method that handle new message from the topic
     public void handle(MqttMessage message) {
         try {
-            System.out.println("Received MQTT-message: " + message.toString());
             SensorPositionEvent protoSensPosEvent = ProtoJsonMap.fromJson(message.toString(), SensorPositionEvent.class);
-            // example-JSON: {"sensorId": "UWB_1", "position": {"refSystemId": "ROOT", "point": {"x": 3.0,"y": 2.0,"z": 3.0}, "accuracy": 1.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "lastPosUpdate": "2021-09-14T09:41:20+00:00"}
             //IposPosition pos = IposPosition.parseFrom(message.toString().getBytes());
             assert protoSensPosEvent != null;
-            LOG.info("SensorPositionEvent received: \n" + protoSensPosEvent);
-            System.out.println("SimpleSceneIntegration: Proto-Point: " + protoSensPosEvent.getPosition().getPoint().toString());
             PositionEvent positionEvent = GenericSensorTransformer.posEvent_GSensor2Internal(protoSensPosEvent);
-            System.out.println("SimpleSceneIntegration: Internal-Point: " + positionEvent.getPlacing().getPosition().getPoint().toString());
+            LOG.info("SensorValueIntegration: Transformed Protobuf-SensorPositionEvent into Internal-PositionEvent: " + positionEvent.toString() + ", " + positionEvent.getPlacing().getPosition().getPoint().toString() + ", " + positionEvent.getPlacing().getOrientation().toString());
 
-            System.out.println("SensorValueIntegration: Transformed Protobuf-SensorPositionEvent into Internal-PositionEvent: " + positionEvent.toString() + ", " + positionEvent.getPlacing().getPosition().getPoint().toString() + ", " + positionEvent.getPlacing().getOrientation().toString());
-
-           /* System.out.println("Sending Internal-PositionEvent using mqttService");
-            if (null == mqttService)
-                System.out.println("SimpleSceneIntegration: mqttService is null");
-            else
-                System.out.println("SimpleSceneIntegration: mqttService is not null");
-            mqttService.publish("Human_at_Window_Side", positionEvent.toString(), 0, false);
-*/
             // ggf. anstatt JMS einfach den PositionMonitoringController per Funktionsaufruf aufrufen
             PositionMonitoring.receiveMessage(positionEvent);
             // this.jmsTemplate.convertAndSend("/PositionEvent", protoSensPosEvent); // submit position to the internal broker
diff --git a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
index aae8da291923a18a48f927d1f9136f05eaaf8a39..b6f56efd9b2fb550edd20c1571d0e03dd380a275 100644
--- a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
+++ b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java
@@ -4,72 +4,73 @@ import ipos.project.DataModellntegration.SimpleSceneIntegration.SimpleSceneInteg
 import ipos.project.DataModellntegration.iPos_Datamodel.*;
 import ipos.project.Functionality.eventfilter.eventFilter;
 import ipos.project.Functionality.eventfilter.readConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.logging.log4j.LogManager;
 import org.springframework.jms.annotation.JmsListener;
 import org.springframework.stereotype.Component;
 import ipos.models.SimpleScene.IposPosition;
+import reactor.util.function.Tuple3;
+import reactor.util.function.Tuples;
 
-import java.lang.ref.Reference;
 import java.text.ParseException;
 import java.util.*;
 
 
 @Component
 public class PositionMonitoring {
-    private final Logger LOG = LoggerFactory.getLogger(getClass());
+    private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger();
 
-    public WorldModel wm;
+    private static WorldModel wm;
     private static List<eventFilter> eventFilters = new ArrayList<eventFilter>();
+    private static Map<String, List<String>> zonePopulation = new HashMap<String, List<String>>();
     private IPos_DatamodelFactory modelFactory = IPos_DatamodelFactory.eINSTANCE;
 
+    public static final String EXIT_NOTIFICATION_TYPE = "ExitNotification";
+    public static final String ENTRY_NOTIFICATION_TYPE = "EntryNotification";
+    public static final String UNDEFINED_TYPE = "undefined";
+    public static final String TOPIC_WINDOW = "Human_at_Window_Side";
+    public static final String TOPIC_DOOR = "Human_at_Door_Side";
+    public static final String ZONE_ID_DOOR = "cobot1_door_zone";
+    public static final String ZONE_ID_WINDOW = "cobot1_window_zone";
+
     public PositionMonitoring(){
+        ReferenceSystem rootRefSystem = createReferenceSystem("ROOT", "ROOT", null);
+        List<Space> doorSpaces = new LinkedList<Space>(Arrays.asList(createSpace(2.0f, 2.0f, 2.0f, createPlacing(createPosition(createPoint3D(2.0f, 0.0f, 0f), 1f, rootRefSystem), createOrientation(0f, 0f, 0f, 0f)))));
+        List<Space> windowSpaces = new LinkedList<Space>(Arrays.asList(createSpace(2.0f, 2.0f, 2.0f, createPlacing(createPosition(createPoint3D(2.0f, 4.0f, 0f), 1f, rootRefSystem), createOrientation(0f, 0f, 0f, 0f)))));
+        Zone doorZone = createZone(ZONE_ID_DOOR, ZONE_ID_DOOR, doorSpaces);
+        Zone windowZone = createZone(ZONE_ID_WINDOW, ZONE_ID_WINDOW,windowSpaces);
         wm = modelFactory.createWorldModel();
-        wm.getReferenceSystem().add(createReferenceSystem("ROOT", "ROOT", null));
+        wm.getReferenceSystem().add(rootRefSystem);
         wm.getPois().add(createPOI(createPosition(createPoint3D(1.4f, 2.0f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken1", new HashMap<String,String>()));
         wm.getPois().add(createPOI(createPosition(createPoint3D(3.7f, -2.0f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken2", new HashMap<String,String>()));
         wm.getPois().add(createPOI(createPosition(createPoint3D(-2.4f, -0.5f, 0f), 1f, wm.getReferenceSystem().get(0)), "UWBToken3", new HashMap<String,String>()));
         wm.getZoneMap().add(modelFactory.createZoneMap());
-        List<Space> spaces = Arrays.asList(createSpace(3.0f, 3.0f, 3.0f, createPlacing(createPosition(createPoint3D(1.1f, 0.9f, 0f), 1f, wm.getReferenceSystem().get(0)), createOrientation(0f, 0f, 0f, 0f))));
-        wm.getZoneMap().get(0).getZone().add(createZone("cobot1_warning_zone", "cobot1_warning_zone", spaces));
+        wm.getZoneMap().get(0).getZone().add(doorZone);
+        wm.getZoneMap().get(0).getZone().add(windowZone);
         wm.getAgent().add(createAgent("Employee1", "HUMAN"));
         wm.getAgent().get(0).getLObject().add(createLobject("UWB_1", "UWB", wm.getAgent().get(0), null));
-        initEventFiltersForDemo();
-    }
-
-    private void initEventFiltersForDemo(){
-        String taskIdWindow = "Human_at_Window_Side";
-        String taskIdDoor = "Human_at_Door_Side";
-        ReferenceSystem rootRefSystem = createReferenceSystem("ROOT", "ROOT", null);
-        eventFilter filterWindow = createWindowZoneEventFilter(taskIdWindow, rootRefSystem);
-        eventFilter filterDoor = createDoorZoneEventFilter(taskIdDoor, rootRefSystem);
-        eventFilters.add(filterDoor);
-        eventFilters.add(filterWindow);
-    }
 
-    private eventFilter createWindowZoneEventFilter(String monitoringTaskId, ReferenceSystem rootRefSystem){
-        Space windowSpace = createSpace(2.0f, 2.0f, 2.0f, createPlacing(createPosition(createPoint3D(2.0f, 4.0f, 0f), 1f, rootRefSystem), createOrientation(0f, 0f, 0f, 0f)));
-        Zone windowZone = createZone("cobot1_window_zone", "cobot1_window_zone", Arrays.asList(windowSpace));
-        return createEventFilter(monitoringTaskId, windowZone);
+        MonitoringRequest doorMonReq = createMonitoringRequest(ZONE_ID_DOOR, TOPIC_DOOR);
+        MonitoringRequest windowMonReq = createMonitoringRequest(ZONE_ID_WINDOW, TOPIC_WINDOW);
+        receiveMessage(doorMonReq);
+        receiveMessage(windowMonReq);
     }
 
-    private eventFilter createDoorZoneEventFilter(String monitoringTaskId, ReferenceSystem rootRefSystem){
-        Space windowSpace = createSpace(2.0f, 2.0f, 2.0f, createPlacing(createPosition(createPoint3D(2.0f, 0.0f, 0f), 1f, rootRefSystem), createOrientation(0f, 0f, 0f, 0f)));
-        Zone windowZone = createZone("cobot1_door_zone", "cobot1_door_zone", Arrays.asList(windowSpace));
-        return createEventFilter(monitoringTaskId, windowZone);
+    private MonitoringRequest createMonitoringRequest(String frameId, String monitoringTaskId) {
+        MonitoringRequest monReq = modelFactory.createMonitoringRequest();
+        monReq.setFrameId(frameId);
+        monReq.setMonitoringTaskId(monitoringTaskId);
+        return monReq;
     }
 
-    private eventFilter createEventFilter(String monitoringTaskId, Zone zone){
-        eventFilter filter = new eventFilter(monitoringTaskId);
-        filter.setWM(wm);
-        EventFilterCondition config = modelFactory.createEventFilterCondition();
-        readConfig.setWM(wm);
-        config.setFilterStructure(new boolean[] {false, false, false, false, false, false, false, false, true});
-        config.setPositionConditionCell(readConfig.transformZone2PositionConditionCell(zone));
-
-        //readConfig.readFilterConfigFromMonitoringRequest(monReq, config);
-        filter.init(config);
-        return filter;
+    public static LocalizableObject getLObjectByIdOrNull(String lObjectId){
+       for (Agent agent : wm.getAgent()){
+            for (LocalizableObject lObject : agent.getLObject()){
+                if (lObject.getId().equals(lObjectId)){
+                    return lObject;
+                }
+            }
+        }
+        return null;
     }
 
     private POI createPOI(Position position, String description, Map<String, String> data){
@@ -169,36 +170,118 @@ public class PositionMonitoring {
         filter.setWM(wm);
         EventFilterCondition config = modelFactory.createEventFilterCondition();
         readConfig.setWM(wm);
-        readConfig.readFilterConfigFromMonitoringRequest(monReq, config);
+        if (! readConfig.readFilterConfigFromMonitoringRequest(monReq, config)){
+            return; // monitoringRequest could not be read
+        }
         filter.init(config);
         eventFilters.add(filter);
+        LOG.info("EventFilter was created");
     }
 
+    private static boolean isDoor = false;
+    private static boolean isCentre = false;
+    private static boolean isWindow = false;
+    private static boolean firstMessage = true;
+
     // @JmsListener(destination = "/PositionEvent", containerFactory = "jmsListenFactory")
     public static void receiveMessage(PositionEvent posEvent) {
-        // LOG.info("Received <" + posEvent + ">");
-        System.out.println("MonitoringController: Received <" + posEvent.toString() + ">");
-        String taskIdWindow = "Human_at_Window_Side";
-        String taskIdDoor = "Human_at_Door_Side";
-        float y_coordinate = ((Point3D) posEvent.getPlacing().getPosition().getPoint()).getY();
-        if (y_coordinate > 2.08f){
-            SimpleSceneIntegration.receiveMessage(posEvent, taskIdWindow);
-        }else{
-            SimpleSceneIntegration.receiveMessage(posEvent, taskIdDoor);
-        }
-
-        /*
+        LOG.info("Received <" + posEvent + ">");
+        List<Tuple3<PositionEvent, String, String>> entryNotifications = new LinkedList<>();
         for (eventFilter eFilter : eventFilters){
             try {
-                if(eFilter.process(posEvent)){
-                    String monitoringTaskId = eFilter.getMonitoringTaskId();
+                boolean posEventMeetsFilterConditions = !eFilter.process(posEvent);
+                if(posEventMeetsFilterConditions){
+                    LOG.info(eFilter.getMonitoringTaskId() + "-EventFilter accepted the position");
+                    if (isEntryNotification(posEvent, eFilter)) {
+                        entryNotifications.add(Tuples.of(posEvent, eFilter.getMonitoringTaskId(), ENTRY_NOTIFICATION_TYPE)); // note: EntryNotifications are sent after that all ExitNotifications have been sent
+                        associateLObjectWithZone(eFilter.getFilterConditionConfig().getPositionConditionCellId(), posEvent.getLObjectId());
+                    }else {
+                        SimpleSceneIntegration.receiveMessage(posEvent, eFilter.getMonitoringTaskId(), UNDEFINED_TYPE);
+                    }
+                }else if (isExitNotification(posEvent, eFilter)){
+                    disassociateLObjectFromZone(eFilter.getFilterConditionConfig().getPositionConditionCellId(), posEvent.getLObjectId());
+                    SimpleSceneIntegration.receiveMessage(posEvent, eFilter.getMonitoringTaskId(), EXIT_NOTIFICATION_TYPE); // note: ExitNotifications are sent immediately
+                 }
 
-                    // posEvent und mqtt-topic (monitoringTaskId) per JMS an SimpleSceneIntegration-Komponente zum Aussenden weiterleiten
-                }
             } catch (ParseException e) {
+                sendEntryNotifications(entryNotifications);
                 e.printStackTrace();
+                return;
             }
         }
-        */
+        sendEntryNotifications(entryNotifications);
+    }
+
+    /**
+     *     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: lObjectIds are removed from the map zonePopulation
+     * @param posEvent
+     * @param eFilter
+     * @return
+     */
+    private static boolean isExitNotification(PositionEvent posEvent, eventFilter eFilter) {
+        String zoneId = eFilter.getFilterConditionConfig().getPositionConditionCellId();
+        String lObjectId = posEvent.getLObjectId();
+        if(null == zoneId) return false;
+        if (isLocatedInsideZone(zoneId, lObjectId)){
+            disassociateLObjectFromZone(zoneId, lObjectId);
+            return true;
+        }else{
+            return false;
+        }
+    }
+
+    /**
+     * Assumption: posEvent contains a position which is located within the zone associated to eFilter.
+     * Function has a side-effect: lObjectIds are added to the map zonePopulation
+     * @param posEvent
+     * @param eFilter
+     * @return
+     */
+    private static boolean isEntryNotification(PositionEvent posEvent, eventFilter eFilter) {
+        String zoneId = eFilter.getFilterConditionConfig().getPositionConditionCellId();
+        String lObjectId = posEvent.getLObjectId();
+        LOG.info("zoneId: " + zoneId + "; lObjectId: " + lObjectId);
+        if(null == zoneId) return false;
+        if (isLocatedInsideZone(zoneId, lObjectId)){
+            return false;
+        }else{
+            associateLObjectWithZone(zoneId, lObjectId);
+            return true;
+        }
+    }
+
+    private static boolean isLocatedInsideZone(String zoneId, String lObjectId) {
+        List<String> lObjectsInsideZone = zonePopulation.get(zoneId);
+        if (null == lObjectsInsideZone) {
+            return false;
+        }
+        return lObjectsInsideZone.contains(lObjectId);
+    }
+
+    private static void associateLObjectWithZone(String zoneId, String lObjectId) {
+        if(zonePopulation.keySet().contains(zoneId)){
+            zonePopulation.get(zoneId).add(lObjectId);
+        }else{
+            zonePopulation.put(zoneId, new LinkedList<String>(Arrays.asList(lObjectId)));
+        }
+    }
+
+    private static void disassociateLObjectFromZone(String zoneId, String lObjectId) {
+        if(zonePopulation.keySet().contains(zoneId)){
+            List<String> objList = zonePopulation.get(zoneId);
+            if (!zonePopulation.get(zoneId).remove(lObjectId)){
+                LOG.warn("LocalizableObjectId cannot be removed as it is currently not associated with the given zone");
+            }
+        }else{
+            LOG.warn("LocalizableObjectId cannot be removed as there are currently no LocalizableObjectIds associated to the zone");
+        }
+    }
+
+    private static void sendEntryNotifications(List<Tuple3<PositionEvent, String, String>> entryNotifications) {
+        for (Tuple3<PositionEvent, String, String> entryNotification : entryNotifications){
+            SimpleSceneIntegration.receiveMessage(entryNotification.getT1(), entryNotification.getT2(), entryNotification.getT3());
+        }
     }
 }