Index: /code/branches/physics/src/orxonox/objects/Scene.cc
===================================================================
--- /code/branches/physics/src/orxonox/objects/Scene.cc	(revision 2312)
+++ /code/branches/physics/src/orxonox/objects/Scene.cc	(revision 2313)
@@ -125,18 +125,4 @@
 
         XMLPortObjectExtended(Scene, BaseObject, "", addObject, getObject, xmlelement, mode, true, false);
-
-        // finally add all rigid bodies to the physics engine
-        if (hasPhysics())
-        {
-            for (std::list<BaseObject*>::const_iterator it = this->objects_.begin(); it != this->objects_.end(); ++it)
-            {
-                WorldEntity* temp = dynamic_cast<WorldEntity*>(*it);
-                if (temp)
-                {
-                    if (temp->getCollisionType() != WorldEntity::None)
-                        this->physicalWorld_->addRigidBody(temp->getPhysicalBody());
-                }
-            }
-        }
     }
 
@@ -172,8 +158,22 @@
     void Scene::tick(float dt)
     {
-        // TODO: This is not stable! If physics cannot be calculated real time anymore,
-        //       framerate will drop exponentially.
         if (physicalWorld_)
+        {
+            if (this->physicsQueue_.size() > 0)
+            {
+                // Add all scheduled WorldEntities
+                for (std::set<btRigidBody*>::const_iterator it = this->physicsQueue_.begin();
+                    it != this->physicsQueue_.end(); ++it)
+                {
+                    if (!(*it)->isInWorld())
+                        this->physicalWorld_->addRigidBody(*it);
+                }
+                this->physicsQueue_.clear();
+            }
+
+            // TODO: This is not stable! If physics cannot be calculated real time anymore,
+            //       framerate will drop exponentially.
             physicalWorld_->stepSimulation(dt,(int)(dt/0.0166666f + 1.0f));
+        }
     }
 
@@ -224,3 +224,25 @@
         return 0;
     }
+
+    void Scene::addRigidBody(btRigidBody* body)
+    {
+        if (!this->physicalWorld_)
+            COUT(1) << "Error: Cannot WorldEntity body to physical Scene: No physics." << std::endl;
+        else if (body)
+            this->physicsQueue_.insert(body);
+    }
+
+    void Scene::removeRigidBody(btRigidBody* body)
+    {
+        if (!this->physicalWorld_)
+            COUT(1) << "Error: Cannot WorldEntity body to physical Scene: No physics." << std::endl;
+        else if (body)
+        {
+            this->physicalWorld_->removeRigidBody(body);
+            // Also check queue
+            std::set<btRigidBody*>::iterator it = this->physicsQueue_.find(body);
+            if (it != this->physicsQueue_.end())
+                this->physicsQueue_.erase(it);
+        }
+    }
 }
Index: /code/branches/physics/src/orxonox/objects/Scene.h
===================================================================
--- /code/branches/physics/src/orxonox/objects/Scene.h	(revision 2312)
+++ /code/branches/physics/src/orxonox/objects/Scene.h	(revision 2313)
@@ -68,12 +68,10 @@
                 { return this->bShadows_; }
 
-            //inline const Vector3& getWorldAabbMax()
-            //{
-            //    this->physicalWorld_->getBroadphase();
-            //}
-
             inline bool hasPhysics()
                 { return this->physicalWorld_ != 0; }
             void setPhysicalWorld(bool wantsPhysics, const Vector3& worldAabbMin, const Vector3& worldAabbMax);
+
+            void addRigidBody(btRigidBody* body);
+            void removeRigidBody(btRigidBody* body);
 
             void tick(float dt);
@@ -92,4 +90,5 @@
 
             btDiscreteDynamicsWorld* physicalWorld_;
+            std::set<btRigidBody*>   physicsQueue_;
 
             std::string            skybox_;
Index: /code/branches/physics/src/orxonox/objects/worldentities/WorldEntity.cc
===================================================================
--- /code/branches/physics/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2312)
+++ /code/branches/physics/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2313)
@@ -89,5 +89,11 @@
                 this->getScene()->getSceneManager()->destroySceneNode(this->node_->getName());
 
-            this->setCollisionType(None);
+            if (this->physicalBody_)
+            {
+                if (this->physicalBody_->isInWorld())
+                    this->getScene()->getPhysicalWorld()->removeRigidBody(this->physicalBody_);
+                delete this->physicalBody_;
+            }
+            // TODO: Delete collisionShapes
         }
     }
@@ -147,8 +153,11 @@
             else if (object->isKinematic())
                 ThrowException(NotImplemented, "Cannot attach a kinematic object to a static or kinematic one: Not yet implemented.");
-            else if (object->physicalBody_->isInWorld() || this->physicalBody_->isInWorld())
-                ThrowException(PhysicsViolation, "Cannot attach a physical object at runtime.");
             else
             {
+                if (this->physicalBody_->isInWorld())
+                    removeFromPhysicalWorld();
+                if (object->physicalBody_->isInWorld())
+                    this->getScene()->removeRigidBody(object->physicalBody_);
+
                 // static to static/kinematic/dynamic --> merge shapes
                 this->childMass_ += object->getMass();
@@ -157,4 +166,6 @@
                 // That also implies that cannot add a physics WE to the child afterwards.
                 object->setCollisionType(None);
+
+                addToPhysicalWorld();
             }
         }
@@ -209,7 +220,5 @@
             // recalculate inertia tensor
             if (this->isDynamic())
-            {
                 internalSetMassProps();
-            }
         }
         else
@@ -228,8 +237,12 @@
         {
             if (this->physicalBody_->isInWorld())
-                COUT(2) << "Warning: Cannot attach a physical object at runtime.";
-            else
-                this->physicalBody_->setCollisionShape(this->collisionShape_->getCollisionShape());
-        }
+            {
+                COUT(2) << "Warning: Attaching collision shapes at run time causes its physical body to be removed and added again.";
+                removeFromPhysicalWorld();
+            }
+            this->physicalBody_->setCollisionShape(this->collisionShape_->getCollisionShape());
+        }
+
+        addToPhysicalWorld();
     }
 
@@ -257,4 +270,16 @@
     }
 
+    void WorldEntity::addToPhysicalWorld() const
+    {
+        if (this->isActive() && this->hasPhysics() && !this->physicalBody_->isInWorld())
+            this->getScene()->addRigidBody(this->physicalBody_);
+    }
+
+    void WorldEntity::removeFromPhysicalWorld() const
+    {
+        if (this->hasPhysics())
+            this->getScene()->removeRigidBody(this->physicalBody_);
+    }
+
     void WorldEntity::setScale3D(const Vector3& scale)
     {
@@ -278,8 +303,15 @@
         if (!this->hasPhysics())
             COUT(3) << "Warning: Setting the mass of a WorldEntity with no physics has no effect." << std::endl;
-        else if (this->physicalBody_->isInWorld())
-            COUT(2) << "Warning: Cannot set the physical mass at run time. Storing new mass." << std::endl;
-        else
+        else
+        {
+            if (this->physicalBody_->isInWorld())
+            {
+                COUT(2) << "Warning: Setting the mass of a WorldEntity at run time causes its physical body to be removed and added again." << std::endl;
+                removeFromPhysicalWorld();
+            }
             internalSetMassProps();
+        }
+
+        addToPhysicalWorld();
     }
 
@@ -340,6 +372,6 @@
         {
             // Destroy rigid body
-            if (this->physicalBody_->isInWorld())
-                this->getScene()->getPhysicalWorld()->removeRigidBody(this->physicalBody_);
+            assert(this->physicalBody_);
+            removeFromPhysicalWorld();
             delete this->physicalBody_;
             this->physicalBody_ = 0;
@@ -370,4 +402,6 @@
         // update mass and inertia tensor
         internalSetMassProps(); // type is not None! See case None: in switch
+
+        addToPhysicalWorld();
     }
 
Index: /code/branches/physics/src/orxonox/objects/worldentities/WorldEntity.h
===================================================================
--- /code/branches/physics/src/orxonox/objects/worldentities/WorldEntity.h	(revision 2312)
+++ /code/branches/physics/src/orxonox/objects/worldentities/WorldEntity.h	(revision 2313)
@@ -217,4 +217,6 @@
             btVector3 getLocalInertia(btScalar mass) const;
             bool checkPhysics() const;
+            void addToPhysicalWorld() const;
+            void removeFromPhysicalWorld() const;
 
             CollisionType                collisionType_;
