Index: /code/branches/objecthierarchy/src/CMakeLists.txt
===================================================================
--- /code/branches/objecthierarchy/src/CMakeLists.txt	(revision 374)
+++ /code/branches/objecthierarchy/src/CMakeLists.txt	(revision 375)
@@ -3,5 +3,5 @@
 # create a few variables to simplify life
 SET(SRC_FILES orxonox/orxonox.cc loader/LevelLoader.cc xml/xmlParser.cc orxonox/core/IdentifierList.cc orxonox/core/Identifier.cc orxonox/core/MetaObjectList.cc orxonox/core/Factory.cc orxonox/core/OrxonoxClass.cc orxonox/objects/BaseObject.cc orxonox/objects/test1.cc orxonox/objects/test2.cc orxonox/objects/test3.cc)
-SET(INC_FILES loader/LevelLoader.h xml/xmlParser.h orxonox/core/IdentifierIncludes.h orxonox/core/Identifier.h orxonox/core/Factory.h orxonox/core/ClassFactory.h orxonox/core/IdentifierList.h orxonox/core/ObjectList.h orxonox/core/MetaObjectList.h orxonox/core/Iterator.h orxonox/core/OrxonoxClass.h orxonox/objects/BaseObject.h orxonox/objects/Test.h orxonox/objects/test1.h orxonox/objects/test2.h orxonox/objects/test3.h)
+SET(INC_FILES loader/LevelLoader.h xml/xmlParser.h orxonox/core/IdentifierIncludes.h orxonox/core/Identifier.h orxonox/core/Factory.h orxonox/core/ClassFactory.h orxonox/core/IdentifierList.h orxonox/core/ObjectList.h orxonox/core/MetaObjectList.h orxonox/core/Iterator.h orxonox/core/OrxonoxClass.h orxonox/objects/BaseObject.h orxonox/objects/Test.h orxonox/objects/test1.h orxonox/objects/test2.h orxonox/objects/test3.h orxonox/objects/Tickable.h orxonox/objects/Timer.h)
 
 #Creates an executable
Index: /code/branches/objecthierarchy/src/orxonox/objects/Tickable.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/Tickable.h	(revision 375)
+++ /code/branches/objecthierarchy/src/orxonox/objects/Tickable.h	(revision 375)
@@ -0,0 +1,33 @@
+#ifndef _Tickable_H__
+#define _Tickable_H__
+
+#include "../core/IdentifierIncludes.h"
+#include "Ogre.h"
+
+namespace orxonox
+{
+    class TickFrameListener;
+
+    class Tickable : virtual public OrxonoxClass
+    {
+        public:
+            virtual void tick(float dt) = 0;
+
+        protected:
+            Tickable() { RegisterRootObject(Tickable); }
+    };
+
+    class TickFrameListener : public Ogre::FrameListener
+    {
+        private:
+            bool frameStarted(const Ogre::FrameEvent &evt)
+            {
+                for (Iterator<Tickable> it = ObjectList<Tickable>::start(); it; ++it)
+                    it->tick(evt.timeSinceLastFrame);
+
+                return FrameListener::frameStarted(evt);
+            }
+    };
+}
+
+#endif
Index: /code/branches/objecthierarchy/src/orxonox/objects/Timer.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/Timer.h	(revision 375)
+++ /code/branches/objecthierarchy/src/orxonox/objects/Timer.h	(revision 375)
@@ -0,0 +1,105 @@
+#ifndef _Timer_H__
+#define _Timer_H__
+
+#include "../core/IdentifierIncludes.h"
+#include "Ogre.h"
+
+namespace orxonox
+{
+    class TimerBase : public OrxonoxClass
+    {
+        friend class TimerFrameListener;
+
+        public:
+            TimerBase()
+            {
+                RegisterRootObject(TimerBase);
+
+                this->interval_ = 0;
+                this->bLoop_ = false;
+                this->bActive_ = false;
+
+                this->time_ = 0;
+            }
+
+            virtual void run() const = 0;
+
+            inline void startTimer() { this->bActive_ = true; this->time_ = this->interval_; }
+            inline void stopTimer() { this->bActive_ = false; this->time_ = this->interval_; }
+            inline void pauseTimer() { this->bActive_ = false; }
+            inline void unpauseTimer() { this->bActive_ = true; }
+            inline bool isActive() const { return this->bActive_; }
+
+        protected:
+            float interval_;
+            bool bLoop_;
+            bool bActive_;
+
+            float time_;
+    };
+
+    template <class T = BaseObject>
+    class Timer : public TimerBase
+    {
+        public:
+            Timer()
+            {
+                this->timerFunction_ = 0;
+                this->object_ = 0;
+            }
+
+            Timer(float interval, bool bLoop, T* object, void (T::*timerFunction)())
+            {
+                this->setTimer(interval, bLoop, timerFunction, object);
+            }
+
+            void setTimer(float interval, bool bLoop, T* object, void (T::*timerFunction)())
+            {
+                this->interval_ = interval;
+                this->bLoop_ = bLoop;
+                this->timerFunction_ = timerFunction;
+                this->object_ = object;
+                this->bActive_ = true;
+
+                this->time_ = interval;
+            }
+
+            void run() const
+            {
+                ((*this->object_).*timerFunction_)();
+            }
+
+        private:
+            void (T::*timerFunction_)();
+            T* object_;
+    };
+
+    class TimerFrameListener : public Ogre::FrameListener
+    {
+        private:
+            bool frameStarted(const Ogre::FrameEvent &evt)
+            {
+                for (Iterator<TimerBase> it = ObjectList<TimerBase>::start(); it; ++it)
+                {
+                    if (it->isActive())
+                    {
+                        it->time_ -= evt.timeSinceLastFrame;
+
+                        if (it->time_ <= 0)
+                        {
+                            if (it->bLoop_)
+                                it->time_ += it->interval_;
+                            else
+                                it->stopTimer();
+
+                            it->run();
+                        }
+                    }
+                }
+
+                return FrameListener::frameStarted(evt);
+            }
+    };
+}
+
+#endif
Index: /code/branches/objecthierarchy/src/orxonox/objects/test1.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/test1.cc	(revision 374)
+++ /code/branches/objecthierarchy/src/orxonox/objects/test1.cc	(revision 375)
@@ -18,4 +18,9 @@
     Test1::~Test1()
     {
+    }
+
+    void Test1::tick(float dt)
+    {
+        std::cout << "Test1: " << this << "\n";
     }
 
Index: /code/branches/objecthierarchy/src/orxonox/objects/test1.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/test1.h	(revision 374)
+++ /code/branches/objecthierarchy/src/orxonox/objects/test1.h	(revision 375)
@@ -3,13 +3,16 @@
 
 #include "BaseObject.h"
+#include "Tickable.h"
 #include "test3.h"
 
 namespace orxonox
 {
-    class Test1 : public BaseObject
+    class Test1 : public BaseObject, public Tickable
     {
         public:
             Test1();
             virtual ~Test1();
+
+            virtual void tick(float dt);
 
             bool usefullClass1isA(Identifier* identifier);
Index: /code/branches/objecthierarchy/src/orxonox/objects/test2.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/test2.cc	(revision 374)
+++ /code/branches/objecthierarchy/src/orxonox/objects/test2.cc	(revision 375)
@@ -14,8 +14,27 @@
         this->usefullClass2_ = Class(Test2);
         this->usefullClass3_ = Class(Test3);
+
+        timer1.setTimer(1, true, this, &Test2::timerFunction1);
+        timer2.setTimer(5, true, this, &Test2::timerFunction2);
+        timer3.setTimer(10, false, this, &Test2::timerFunction3);
     }
 
     Test2::~Test2()
     {
+    }
+
+    void Test2::timerFunction1()
+    {
+        std::cout << "Test2: 1 Sekunde\n";
+    }
+
+    void Test2::timerFunction2()
+    {
+        std::cout << "Test2: 5 Sekunden\n";
+    }
+
+    void Test2::timerFunction3()
+    {
+        std::cout << "Test2: 10 Sekunden sind um!\n";
     }
 
Index: /code/branches/objecthierarchy/src/orxonox/objects/test2.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/test2.h	(revision 374)
+++ /code/branches/objecthierarchy/src/orxonox/objects/test2.h	(revision 375)
@@ -3,4 +3,5 @@
 
 #include "BaseObject.h"
+#include "Timer.h"
 
 namespace orxonox
@@ -21,4 +22,8 @@
             void setUsefullClassOfTypeTest3(Identifier* identifier);
 
+            void timerFunction1();
+            void timerFunction2();
+            void timerFunction3();
+
         private:
             Identifier* usefullClass1_;
@@ -26,4 +31,7 @@
             SubclassIdentifier<Test3> usefullClass3_;
 
+            Timer<Test2> timer1;
+            Timer<Test2> timer2;
+            Timer<Test2> timer3;
     };
 }
Index: /code/branches/objecthierarchy/src/orxonox/orxonox.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/orxonox.cc	(revision 374)
+++ /code/branches/objecthierarchy/src/orxonox/orxonox.cc	(revision 375)
@@ -39,8 +39,11 @@
 #include <iostream>
 
-#include "../xml/xmlParser.h"
-#include "../loader/LevelLoader.h"
+//#include "../xml/xmlParser.h"
+//#include "../loader/LevelLoader.h"
 
 #include "core/IdentifierIncludes.h"
+#include "objects/Tickable.h"
+#include "objects/Timer.h"
+
 #include "objects/BaseObject.h"
 #include "objects/Test.h"
@@ -48,5 +51,4 @@
 #include "objects/test2.h"
 #include "objects/test3.h"
-
 
 // some tests to see if enet works without includsion
@@ -106,5 +108,4 @@
       void go()
       {
-/*
         createRoot();
         defineResources();
@@ -117,6 +118,5 @@
         setupCEGUI();
         createFrameListener();
-        startRenderLoop();
-*/
+
 
         #define testandcout(code) \
@@ -148,5 +148,5 @@
         test4 = new A3();
 */
-
+/*
         std::cout << "Test 5\n";
         A1* test5_01 = new A1();
@@ -218,5 +218,5 @@
         std::cout << "ID of BaseObject: " << Class(BaseObject)->getNetworkID() << "\n";
         std::cout << "ID of Test1: " << Class(Test1)->getNetworkID() << "\n";
-
+*/
 /*
         std::cout << "\n";
@@ -474,5 +474,5 @@
         delete test9_06;
 */
-
+/*
         std::cout << "Test 10\n";
         Identifier* test10_01 = Class(A1B2);
@@ -605,5 +605,28 @@
 
         std::cout << "13\n";
-
+*/
+        std::cout << "Test 11\n";
+/*
+        std::cout << "1\n";
+        count = 0; for (Iterator<Tickable> it = ObjectList<Tickable>::start(); it; ++it) { count++; }
+        std::cout << "AnzahlTickable: " << count << "\n";
+
+        Test1* test11_1;
+        for (int i = 0; i < 3; i++)
+            test11_1 = new Test1;
+
+        count = 0; for (Iterator<Tickable> it = ObjectList<Tickable>::start(); it; ++it) { count++; }
+        std::cout << "AnzahlTickable: " << count << "\n";
+
+        for (Iterator<Tickable> it = ObjectList<Tickable>::start(); it; ++it)
+            it->tick(0);
+
+        std::cout << "2\n";
+*/
+
+        Test2* test11_2 = new Test2;
+        std::cout << "3\n";
+
+        startRenderLoop();
       }
 
@@ -687,6 +710,6 @@
       {
 
-        string levelFile = "sp_level_moonstation.oxw";
-        loader::LevelLoader* loader = new loader::LevelLoader(levelFile);
+//        string levelFile = "sp_level_moonstation.oxw";
+//        loader::LevelLoader* loader = new loader::LevelLoader(levelFile);
       }
 
@@ -735,4 +758,10 @@
       void createFrameListener()
       {
+        TickFrameListener* TickFL = new TickFrameListener();
+        mRoot->addFrameListener(TickFL);
+
+        TimerFrameListener* TimerFL = new TimerFrameListener();
+        mRoot->addFrameListener(TimerFL);
+
         mListener = new OrxExitListener(mKeyboard);
         mRoot->addFrameListener(mListener);
