Index: code/branches/ai2/src/orxonox/controllers/AIController.cc
===================================================================
--- code/branches/ai2/src/orxonox/controllers/AIController.cc	(revision 8773)
+++ code/branches/ai2/src/orxonox/controllers/AIController.cc	(revision 8786)
@@ -114,4 +114,16 @@
                 this->bShooting_ = false;
 
+            // boost
+            random = rnd(maxrand);
+            if (random < botlevel_*100 )
+                this->boostControl();
+
+            // update Checkpoints
+            random = rnd(maxrand);
+            if (this->defaultWaypoint_ && random > (maxrand-10))
+                this->manageWaypoints();
+            else //if(random > maxrand-10) //CHECK USABILITY!!
+                this->manageWaypoints();
+
         }
 
@@ -196,8 +208,15 @@
                     this->bShooting_ = false;
 
-                //boost
+                // boost
                 random = rnd(maxrand);
                 if (random < botlevel_*100 )
-                    this->boostControl(); //TEST
+                    this->boostControl();
+
+                // update Checkpoints
+                random = rnd(maxrand);
+                if (this->defaultWaypoint_ && random > (maxrand-10))
+                    this->manageWaypoints();
+                else //if(random > maxrand-10) //CHECK USABILITY!!
+                    this->manageWaypoints();
             }
         }
@@ -212,10 +231,20 @@
         float random;
         float maxrand = 100.0f / ACTION_INTERVAL;
-        if (this->waypoints_.size() > 0 && this->getControllableEntity() && this->mode_ == DEFAULT) //Waypoint functionality.
+        ControllableEntity* controllable = this->getControllableEntity();
+
+        if (controllable && this->mode_ == DEFAULT)// bot is ready to move to a target
         {
-            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->waypoints_.size() > 0 ) //Waypoint functionality.
+            {
+                if (this->waypoints_[this->waypoints_.size()-1]->getWorldPosition().squaredDistance(controllable->getPosition()) <= this->squaredaccuracy_)
+                    this->waypoints_.pop_back(); // if goal is reached, remove it from the list
+                if(this->waypoints_.size() > 0 )
+                    this->moveToPosition(this->waypoints_[this->waypoints_.size()-1]->getWorldPosition());
+            }
+            else if(this->defaultWaypoint_ && ((this->defaultWaypoint_->getPosition()-controllable->getPosition()).length()  > 200.0f))
+            {
+                this->moveToPosition(this->defaultWaypoint_->getPosition()); // stay within a certain range of the defaultWaypoint_
+                random = rnd(maxrand);
+            }
         }
         if(this->mode_ == DEFAULT)
@@ -283,5 +312,4 @@
         else if (this->mode_ == ROCKET)//Rockets do not belong to a group of bots -> bot states are not relevant.
         {   //Vector-implementation: mode_.back() == ROCKET;
-            ControllableEntity *controllable = this->getControllableEntity();
             if(controllable)
             {
Index: code/branches/ai2/src/orxonox/controllers/ArtificialController.cc
===================================================================
--- code/branches/ai2/src/orxonox/controllers/ArtificialController.cc	(revision 8773)
+++ code/branches/ai2/src/orxonox/controllers/ArtificialController.cc	(revision 8786)
@@ -96,5 +96,6 @@
         this->timeout_ = 0;
         this->currentWaypoint_ = 0;
-        this->setAccuracy(100);
+        this->setAccuracy(9);
+        this->defaultWaypoint_ = NULL;
     }
 
@@ -1125,4 +1126,7 @@
     }
 
+    /**
+        @brief Manages boost. Switches between boost usage and boost safe mode.
+    */
     void ArtificialController::boostControl()
     {
@@ -1158,43 +1162,26 @@
     }
 
-    void ArtificialController::updatePointsOfInterest(std::string name, float distance)
+    /**
+        @brief Adds first waypoint of type name to the waypoint stack, which is within the searchDistance
+        @param name object-name of a point of interest (e.g. "PickupSpawner", "ForceField")
+    */
+    void ArtificialController::updatePointsOfInterest(std::string name, float searchDistance)
     {
         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!), ...
-                //distance to POI decides wether it is added (neither too close nor too far away)
-                //How should POI's be managed? (e.g. Look for POIs if there are no real targets to move to or if they can be taken "en passant".)
-                   waypoint = *it;
-                   if(waypoint->getIdentifier() == ClassByString(name))
-                   {
-                       ControllableEntity* controllable = this->getControllableEntity();
-                       if(!controllable) continue;
-                       float distance = ( waypoint->getPosition() - controllable->getPosition() ).length();
-                       if(distance > 50.0f || distance < 5.0f) continue;
-                       if(name == "PickupSpawner") // PickupSpawner: adjust waypoint accuracy to PickupSpawner's triggerdistance
-                       {
-                           squaredaccuracy_ = waypoint->getTriggerDistance() * waypoint->getTriggerDistance();
-                       }
-                       else if(name == "ForceField") // ForceField: analyze is angle between forcefield boost and own flying direction is acceptable
-                       {
-
-                       }
-
-
-                       break;
-                   }
-
-                /*const Vector3 realDistance = it->getPosition() - this->getControllableEntity()->getPosition();
-                if( realDistance.length() < distance)
+        for (ObjectList<WorldEntity>::iterator it = ObjectList<WorldEntity>::begin(); it != ObjectList<WorldEntity>::end(); ++it)
+        {
+            if((*it)->getIdentifier() == ClassByString(name))
+            {
+                ControllableEntity* controllable = this->getControllableEntity();
+                if(!controllable) continue;
+                float actualDistance = ( (*it)->getPosition() - controllable->getPosition() ).length();
+                if(actualDistance > searchDistance || actualDistance < 5.0f) continue;
+                    // TODO: PickupSpawner: adjust waypoint accuracy to PickupSpawner's triggerdistance
+                    // TODO: ForceField: analyze is angle between forcefield boost and own flying direction is acceptable
+                else
                 {
-                    float minDistance = it->getTriggerDistance().length()*it->getTriggerDistance().length();
-                    if(this->squaredaccuracy_ > minDistance)
-                        this->squaredaccuracy_ = minDistance;
-                    //waypoint = static_cast<WorldEntity*>(it);
+                    waypoint = *it;
                     break;
-               // }*/
+                }
             }
         }
@@ -1203,3 +1190,14 @@
     }
 
+    /**
+        @brief Adds point of interest depending on context
+    */
+    void ArtificialController::manageWaypoints()
+    {
+        if(!defaultWaypoint_)
+            this->updatePointsOfInterest("PickupSpawner", 60.0f); // long search radius if there is no default goal
+        else
+            this->updatePointsOfInterest("PickupSpawner", 20.0f); // take pickup en passant if there is a default waypoint
+    }
+
 }
Index: code/branches/ai2/src/orxonox/controllers/ArtificialController.h
===================================================================
--- code/branches/ai2/src/orxonox/controllers/ArtificialController.h	(revision 8773)
+++ code/branches/ai2/src/orxonox/controllers/ArtificialController.h	(revision 8786)
@@ -93,4 +93,5 @@
                 { return sqrt(this->squaredaccuracy_); }
             void updatePointsOfInterest(std::string name, float distance);
+            void manageWaypoints();
 
         protected:
@@ -175,4 +176,5 @@
             size_t currentWaypoint_;
             float squaredaccuracy_;
+            WorldEntity* defaultWaypoint_;
     };
 }
Index: code/branches/ai2/src/orxonox/controllers/WaypointController.cc
===================================================================
--- code/branches/ai2/src/orxonox/controllers/WaypointController.cc	(revision 8773)
+++ code/branches/ai2/src/orxonox/controllers/WaypointController.cc	(revision 8786)
@@ -40,4 +40,5 @@
     {
         RegisterObject(WaypointController);
+        this->setAccuracy(100);
     }
 
