Index: code/branches/ai2/src/orxonox/controllers/AIController.cc
===================================================================
--- code/branches/ai2/src/orxonox/controllers/AIController.cc	(revision 8768)
+++ code/branches/ai2/src/orxonox/controllers/AIController.cc	(revision 8769)
@@ -212,4 +212,11 @@
         float random;
         float maxrand = 100.0f / ACTION_INTERVAL;
+        if (this->waypoints_.size() > 0 && this->getControllableEntity() && this->mode_ == DEFAULT) //Waypoint functionality.
+        {
+            if (this->waypoints_[this->currentWaypoint_]->getWorldPosition().squaredDistance(this->getControllableEntity()->getPosition()) <= this->squaredaccuracy_)
+                this->currentWaypoint_ = (this->currentWaypoint_ + 1) % this->waypoints_.size();
+
+            this->moveToPosition(this->waypoints_[this->currentWaypoint_]->getWorldPosition());
+        }
         if(this->mode_ == DEFAULT)
 	    {
Index: code/branches/ai2/src/orxonox/controllers/ArtificialController.cc
===================================================================
--- code/branches/ai2/src/orxonox/controllers/ArtificialController.cc	(revision 8768)
+++ code/branches/ai2/src/orxonox/controllers/ArtificialController.cc	(revision 8769)
@@ -49,4 +49,5 @@
 #include "weaponsystem/Weapon.h"
 #include "weaponsystem/WeaponSlot.h"
+#include "weaponsystem/WeaponSlot.h"
 
 namespace orxonox
@@ -93,5 +94,7 @@
         this->botlevel_ = 0.5f;
         this->mode_ = DEFAULT;////Vector-implementation: mode_.push_back(DEFAULT);
-        this->timeout_=0;
+        this->timeout_ = 0;
+        this->currentWaypoint_ = 0;
+        this->setAccuracy(100);
     }
 
@@ -100,4 +103,6 @@
         if (this->isInitialized())
         {//Vector-implementation: mode_.erase(mode_.begin(),mode_.end());
+            for (size_t i = 0; i < this->waypoints_.size(); ++i)
+                this->waypoints_[i]->destroy();
             this->removeFromFormation();
             this->weaponModes_.clear();
@@ -1140,3 +1145,42 @@
     }
 
+    void ArtificialController::addWaypoint(WorldEntity* waypoint)
+    {
+        this->waypoints_.push_back(waypoint);
+    }
+
+    WorldEntity* ArtificialController::getWaypoint(unsigned int index) const
+    {
+        if (index < this->waypoints_.size())
+            return this->waypoints_[index];
+        else
+            return 0;
+    }
+
+    void ArtificialController::updatePointsOfInterest(std::string name, float distance)
+    {
+        WorldEntity* waypoint = NULL;
+        if(name == "Pickup")
+        {
+            for (ObjectList<WorldEntity>::iterator it = ObjectList<WorldEntity>::begin(); it != ObjectList<WorldEntity>::end(); ++it)
+            {
+                //get POI by string: Possible POIs are PICKUPSPAWNER, FORCEFIELDS (!analyse!), ...
+                //if(it->isA(Pickupable)) //distance to POI decides wether it is added (neither too close nor too far away)
+                //To Think: how should POI's be managed? (e.g. if there are no real moving target or if the can be taken "en passant".)
+                   waypoint = *it;
+                /*const Vector3 realDistance = it->getPosition() - this->getControllableEntity()->getPosition();
+                if( realDistance.length() < distance)
+                {
+                    float minDistance = it->getTriggerDistance().length()*it->getTriggerDistance().length();
+                    if(this->squaredaccuracy_ > minDistance)
+                        this->squaredaccuracy_ = minDistance;
+                    //waypoint = static_cast<WorldEntity*>(it);
+                    break;
+               // }*/
+            }
+        }
+        if(waypoint)
+            this->waypoints_.push_back(waypoint);
+    }
+
 }
Index: code/branches/ai2/src/orxonox/controllers/ArtificialController.h
===================================================================
--- code/branches/ai2/src/orxonox/controllers/ArtificialController.h	(revision 8768)
+++ code/branches/ai2/src/orxonox/controllers/ArtificialController.h	(revision 8769)
@@ -84,4 +84,13 @@
                 { return this->botlevel_; }
             static void setAllBotLevel(float level);
+            //WAYPOINT FUNCTIONS
+            void addWaypoint(WorldEntity* waypoint);
+            WorldEntity* getWaypoint(unsigned int index) const;
+
+            inline void setAccuracy(float accuracy)
+                { this->squaredaccuracy_ = accuracy*accuracy; }
+            inline float getAccuracy() const
+                { return sqrt(this->squaredaccuracy_); }
+            void updatePointsOfInterest(std::string name, float distance);
 
         protected:
@@ -149,15 +158,21 @@
             bool bShooting_;
 
-            std::map<std::string, int> weaponModes_; //<! Links each "weapon" to it's weaponmode- managed by setupWeapons()
-            //std::vector<int> projectiles_; //<! Displays amount of projectiles of each weapon. - managed by setupWeapons()
             float botlevel_; //<! Makes the level of a bot configurable.
-            float timeout_; //<! Timeout for rocket usage. (If a rocket misses, a bot should stop using it.)
-
             enum Mode {DEFAULT, ROCKET, DEFENCE, MOVING};//TODO; implement DEFENCE, MOVING modes
             Mode mode_; //TODO: replace single value with stack-like implementation: std::vector<Mode> mode_;
             void setPreviousMode();
+
+            //WEAPONSYSTEM DATA
+            std::map<std::string, int> weaponModes_; //<! Links each "weapon" to it's weaponmode- managed by setupWeapons()
+            //std::vector<int> projectiles_; //<! Displays amount of projectiles of each weapon. - managed by setupWeapons()
+            float timeout_; //<! Timeout for rocket usage. (If a rocket misses, a bot should stop using it.)
             void setupWeapons(); //<! Defines which weapons are available for a bot. Is recalled whenever a bot was killed.
             bool bSetupWorked; //<! If false, setupWeapons() is called.
             int getFiremode(std::string name);
+
+            //WAYPOINT DATA
+            std::vector<WorldEntity*> waypoints_;
+            size_t currentWaypoint_;
+            float squaredaccuracy_;
     };
 }
Index: code/branches/ai2/src/orxonox/controllers/WaypointController.cc
===================================================================
--- code/branches/ai2/src/orxonox/controllers/WaypointController.cc	(revision 8768)
+++ code/branches/ai2/src/orxonox/controllers/WaypointController.cc	(revision 8769)
@@ -40,16 +40,8 @@
     {
         RegisterObject(WaypointController);
-
-        this->currentWaypoint_ = 0;
-        this->setAccuracy(100);
     }
 
     WaypointController::~WaypointController()
     {
-        if (this->isInitialized())
-        {
-            for (size_t i = 0; i < this->waypoints_.size(); ++i)
-                this->waypoints_[i]->destroy();
-        }
     }
 
@@ -58,6 +50,6 @@
         SUPER(WaypointController, XMLPort, xmlelement, mode);
 
-        XMLPortParam(WaypointController, "accuracy", setAccuracy, getAccuracy, xmlelement, mode).defaultValues(100.0f);
-        XMLPortObject(WaypointController, WorldEntity, "waypoints", addWaypoint, getWaypoint,  xmlelement, mode);
+        XMLPortParam(ArtificialController, "accuracy", setAccuracy, getAccuracy, xmlelement, mode).defaultValues(100.0f);
+        XMLPortObject(ArtificialController, WorldEntity, "waypoints", addWaypoint, getWaypoint,  xmlelement, mode);
     }
 
@@ -76,15 +68,3 @@
     }
 
-    void WaypointController::addWaypoint(WorldEntity* waypoint)
-    {
-        this->waypoints_.push_back(waypoint);
-    }
-
-    WorldEntity* WaypointController::getWaypoint(unsigned int index) const
-    {
-        if (index < this->waypoints_.size())
-            return this->waypoints_[index];
-        else
-            return 0;
-    }
 }
Index: code/branches/ai2/src/orxonox/controllers/WaypointController.h
===================================================================
--- code/branches/ai2/src/orxonox/controllers/WaypointController.h	(revision 8768)
+++ code/branches/ai2/src/orxonox/controllers/WaypointController.h	(revision 8769)
@@ -47,16 +47,6 @@
             virtual void tick(float dt);
 
-            void addWaypoint(WorldEntity* waypoint);
-            WorldEntity* getWaypoint(unsigned int index) const;
+        protected:
 
-            inline void setAccuracy(float accuracy)
-                { this->squaredaccuracy_ = accuracy*accuracy; }
-            inline float getAccuracy() const
-                { return sqrt(this->squaredaccuracy_); }
-
-        protected:
-            std::vector<WorldEntity*> waypoints_;
-            size_t currentWaypoint_;
-            float squaredaccuracy_;
     };
 }
