Index: code/branches/portals/src/orxonox/worldentities/PortalEndPoint.cc
===================================================================
--- code/branches/portals/src/orxonox/worldentities/PortalEndPoint.cc	(revision 8197)
+++ code/branches/portals/src/orxonox/worldentities/PortalEndPoint.cc	(revision 8198)
@@ -11,6 +11,4 @@
     {
         RegisterObject(PortalEndPoint);
-        trigger_.setDistance(10);
-        trigger_.setStayActive(true);
     }
     
@@ -29,6 +27,28 @@
         if(mode == XMLPort::LoadObject)
         {
-            idMap_s[this->id_] = this;
+            PortalEndPoint::idMap_s[this->id_] = this;
         }
     }
+
+    void PortalEndPoint::tick(float dt)
+    {
+        SUPER(PortalEndPoint, tick);
+    }
+
+    void PortalEndPoint::jumpOut(WorldEntity* entity)
+    {
+        this->recentlyJumpedOut_.insert(entity);
+        entity->setPosition(this->getPosition());
+    }
+
+    bool PortalEndPoint::hasRecentlyJumpedOut(WorldEntity* entity)
+    {
+        if(this->recentlyJumpedOut_.find(entity) == this->recentlyJumpedOut_.end())
+        {
+            return false;
+        }
+        else
+            return true;
+    }
+
 }
Index: code/branches/portals/src/orxonox/worldentities/PortalEndPoint.h
===================================================================
--- code/branches/portals/src/orxonox/worldentities/PortalEndPoint.h	(revision 8197)
+++ code/branches/portals/src/orxonox/worldentities/PortalEndPoint.h	(revision 8198)
@@ -8,10 +8,9 @@
 #include "StaticEntity.h"
 #include "graphics/Billboard.h"
-#include "objects/triggers/DistanceMultiTrigger.h"
-#include "tools/interfaces/Tickable.h"
+#include "../../modules/objects/triggers/DistanceMultiTrigger.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport PortalEndPoint : public StaticEntity
+    class _OrxonoxExport PortalEndPoint : public DistanceMultiTrigger
     {
         public:
@@ -20,5 +19,5 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
             //virtual void tick(float dt);
-            static std::map<unsigned int, PortalEndPoint *> idMap_s;
+            static std::map<unsigned int, PortalEndPoint *> idMap_s; //!< maps integer id values to portalendpoints
             inline void setID(unsigned int id)
             {
@@ -30,11 +29,12 @@
                 return this->id_;
             }
+            void jumpOut(WorldEntity * entity); //!< relocate an entity to the position of the endpoint and add it to the set of recentlyPortedOut entities
+            void tick(float dt);
+            bool hasRecentlyJumpedOut(WorldEntity * entity); //!< check if a certain entity recently jumped out of this endpoint
         protected:
         private:
             unsigned int id_;
-            std::set<WorldEntity *> recentlyJumpedOut_;
-            std::string material_;
+            std::set<WorldEntity *> recentlyJumpedOut_; //!< Entities which recently jumped out of this EndPoint, hence they shouldn't be pulled in again if the endpoint is the beginning of a link
             Billboard billboard_;
-            DistanceMultiTrigger trigger_;
     };
 
Index: code/branches/portals/src/orxonox/worldentities/PortalLink.cc
===================================================================
--- code/branches/portals/src/orxonox/worldentities/PortalLink.cc	(revision 8197)
+++ code/branches/portals/src/orxonox/worldentities/PortalLink.cc	(revision 8198)
@@ -1,4 +1,5 @@
 #include "PortalLink.h"
 #include "core/XMLPort.h"
+#include "objects/triggers/MultiTriggerContainer.h"
 
 namespace orxonox
@@ -29,11 +30,29 @@
     }
     
-    void PortalLink::use(WorldEntity * entity)
-    {
-        
-    }
     void PortalLink::tick(float dt)
     {
-        
+        SUPER(PortalLink, tick)
     }
+    
+    void PortalLink::processEvent(Event& event)
+    {
+        SUPER(PortalLink, processEvent);
+        if(!event.activate_)
+        {
+            return;
+        }
+        MultiTriggerContainer * origin = dynamic_cast<MultiTriggerContainer *>(event.originator_);
+        if(!origin)
+        {
+            return;
+        }
+        PortalEndPoint * eventFrom = dynamic_cast<PortalEndPoint *>(origin->getOriginator());
+        WorldEntity * eventEntity = dynamic_cast<WorldEntity *>(origin->getData());
+        if(eventFrom != this->from_ || !eventEntity || eventFrom->hasRecentlyJumpedOut(eventEntity) == true)
+        {
+            return;
+        }
+        to_->jumpOut(entity);
+    }
+
 }
Index: code/branches/portals/src/orxonox/worldentities/PortalLink.h
===================================================================
--- code/branches/portals/src/orxonox/worldentities/PortalLink.h	(revision 8197)
+++ code/branches/portals/src/orxonox/worldentities/PortalLink.h	(revision 8198)
@@ -6,4 +6,5 @@
 #include "core/BaseObject.h"
 #include "PortalEndPoint.h"
+#include "objects/eventsystem/EventListener.h"
 
 #include <set>
@@ -11,5 +12,5 @@
 namespace orxonox
 {
-    class _OrxonoxExport PortalLink : public BaseObject
+    class _OrxonoxExport PortalLink : public EventListener
     {
         public:
@@ -36,4 +37,5 @@
             }
             void use(WorldEntity * entity);
+            virtual void processEvent(Event& event);
         protected:
         private:
@@ -44,4 +46,5 @@
             float activationRadius_;
             std::set<WorldEntity *> recentlyPorted;
+            ObjectList<WorldEntity>::iterator it_;
             bool isNowPortable(WorldEntity * ent);
     };
