Index: code/branches/ai/src/modules/pickup/items/DronePickup.cc
===================================================================
--- code/branches/ai/src/modules/pickup/items/DronePickup.cc	(revision 6833)
+++ code/branches/ai/src/modules/pickup/items/DronePickup.cc	(revision 6847)
@@ -141,5 +141,5 @@
                 if(droneController != NULL)
                 {
-                    droneController->setPawn(pawn);
+                    droneController->setOwner(pawn);
                 }
 
Index: code/branches/ai/src/orxonox/OrxonoxPrereqs.h
===================================================================
--- code/branches/ai/src/orxonox/OrxonoxPrereqs.h	(revision 6833)
+++ code/branches/ai/src/orxonox/OrxonoxPrereqs.h	(revision 6847)
@@ -82,4 +82,5 @@
     class ArtificialController;
     class Controller;
+    class DroneController;
     class HumanController;
     class ScriptController;
@@ -161,4 +162,5 @@
     class CameraPosition;
     class ControllableEntity;
+    class Drone;
     class EffectContainer;
     class ExplosionChunk;
Index: code/branches/ai/src/orxonox/controllers/DroneController.cc
===================================================================
--- code/branches/ai/src/orxonox/controllers/DroneController.cc	(revision 6833)
+++ code/branches/ai/src/orxonox/controllers/DroneController.cc	(revision 6847)
@@ -51,8 +51,10 @@
         // this checks that our creator really is a drone
         // and saves the pointer to the drone for the controlling commands
-        assert(dynamic_cast<Drone*>(creator)!=0);
-        this->setControllableEntity(dynamic_cast<Drone*>(creator));
+
     
         RegisterObject(DroneController);
+
+        this->owner_ = 0;
+        this->drone_ = 0;
 
         this->actionTimer_.setTimer(ACTION_INTERVAL, true, createExecutor(createFunctor(&DroneController::action, this)));
@@ -63,14 +65,14 @@
     }
 
-    void DroneController::setPawn(Pawn* pawn){
-        pawnpointer_ = pawn;
+    void DroneController::setOwner(Pawn* owner){
+        this->owner_ = owner;
     } 
+
+    void DroneController::setDrone(Drone* drone)
+    {
+        this->drone_ = drone;
+        this->setControllableEntity(drone);
+    }
     
-    const Pawn* DroneController::getPawn(unsigned int index) const
-    {
-    if(index == 0) return pawnpointer_;
-    return NULL;
-    }
-
     void DroneController::action()
     {
@@ -78,4 +80,26 @@
         float maxrand = 100.0f / ACTION_INTERVAL;
 
+        const Vector3& ownerPosition = getOwner()->getWorldPosition();
+        const Vector3& dronePosition = getDrone()->getWorldPosition();
+
+        const Vector3& locOwnerDir = getDrone()->getOrientation().UnitInverse()*(dronePosition-ownerPosition); //Vector from Drone To Owner out of drones local coordinate system
+
+        int distance = sqrt( (ownerPosition.x-dronePosition.x)*(ownerPosition.x-dronePosition.x)
+                           + (ownerPosition.y-dronePosition.y)*(ownerPosition.y-dronePosition.y)
+                           + (ownerPosition.z-dronePosition.z)*(ownerPosition.z-dronePosition.z)); //distance to Owner
+
+        if (distance > 500) { //TODO: variable implementation of maxdistance
+            drone_->moveUpDown(-locOwnerDir.y);
+            drone_->moveFrontBack(locOwnerDir.z);
+            drone_->moveRightLeft(-locOwnerDir.x);
+        }
+
+        COUT(0) << "Owner: " << ownerPosition << endl;
+        COUT(0) << "Drone: " << dronePosition << endl;
+        COUT(0) << "Distance: " << distance << endl;
+        COUT(0) << "locDrone: " << locOwnerDir << endl;
+
+
+/*
         // search enemy
         random = rnd(maxrand);
@@ -108,5 +132,5 @@
             this->searchRandomTargetPosition();
 
-     /*   // shoot
+        // shoot
         random = rnd(maxrand);
         if (random < 75 && (this->target_ && !this->bShooting_))
@@ -115,6 +139,6 @@
         // stop shooting
         random = rnd(maxrand);
-        if (random < 25 && (this->bShooting_)) */
-            this->bShooting_ = false;
+        if (random < 25 && (this->bShooting_)) 
+            this->bShooting_ = false; */
     }
 
@@ -128,6 +152,4 @@
     void DroneController::tick(float dt)
     {
-        // Place your code here:
-        // - steering commands
         
 
@@ -135,8 +157,8 @@
 
         if(myDrone != NULL) {
-        
+
         setTargetPosition(this->getControllableEntity()->getPosition());
-/*
-	myDrone->setRotationThrust(25);
+
+/*      myDrone->setRotationThrust(25);
 	myDrone->setAuxilaryThrust(30);
 	myDrone->rotateYaw(10*dt); */
Index: code/branches/ai/src/orxonox/controllers/DroneController.h
===================================================================
--- code/branches/ai/src/orxonox/controllers/DroneController.h	(revision 6833)
+++ code/branches/ai/src/orxonox/controllers/DroneController.h	(revision 6847)
@@ -53,6 +53,12 @@
             
             virtual void tick(float dt); //!< The controlling happens here. This method defines what the controller has to do each tick.
-            void setPawn(Pawn* pawn);
-            const Pawn* getPawn(unsigned int index) const; 
+
+            void setOwner(Pawn* owner);
+            inline Pawn* getOwner() const
+                { return this->owner_; }
+
+            void setDrone(Drone*  drone);
+            inline Drone* getDrone() const
+                { return this->drone_; }
 
         protected:
@@ -61,5 +67,6 @@
         private:
             Timer actionTimer_;
-            Pawn* pawnpointer_;
+            Pawn* owner_;
+            Drone* drone_;
     };
 }
Index: code/branches/ai/src/orxonox/worldentities/Drone.cc
===================================================================
--- code/branches/ai/src/orxonox/worldentities/Drone.cc	(revision 6833)
+++ code/branches/ai/src/orxonox/worldentities/Drone.cc	(revision 6847)
@@ -64,4 +64,6 @@
         
         myController_ = new DroneController(static_cast<BaseObject*>(this)); //!< Creates a new controller and passes our this pointer to it as creator.
+        myController_->setDrone(this);
+
         this->setController(myController_);
     }
