Index: /code/branches/network/src/core/InputBuffer.cc
===================================================================
--- /code/branches/network/src/core/InputBuffer.cc	(revision 1485)
+++ /code/branches/network/src/core/InputBuffer.cc	(revision 1486)
@@ -88,15 +88,4 @@
     }
 
-    void InputBuffer::unregisterListener(InputBufferListener* listener)
-    {
-        for (std::list<InputBufferListenerTuple>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); )
-        {
-            if ((*it).listener_ == listener)
-                this->listeners_.erase(it++);
-            else
-                ++it;
-        }
-    }
-
     void InputBuffer::set(const std::string& input, bool update)
     {
@@ -165,8 +154,8 @@
     void InputBuffer::updated()
     {
-        for (std::list<InputBufferListenerTuple>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
-        {
-            if ((*it).bListenToAllChanges_)
-                (*(*it).listener_.*(*it).function_)();
+        for (std::list<BaseInputBufferListenerTuple*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
+        {
+            if ((*it)->bListenToAllChanges_)
+                (*it)->callFunction();
         }
     }
@@ -174,8 +163,8 @@
     void InputBuffer::updated(const char& update, bool bSingleInput)
     {
-        for (std::list<InputBufferListenerTuple>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
-        {
-            if ((!(*it).trueKeyFalseChar_) && ((*it).bListenToAllChanges_ || ((*it).char_ == update)) && (!(*it).bOnlySingleInput_ || bSingleInput))
-                (*(*it).listener_.*(*it).function_)();
+        for (std::list<BaseInputBufferListenerTuple*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
+        {
+            if ((!(*it)->trueKeyFalseChar_) && ((*it)->bListenToAllChanges_ || ((*it)->char_ == update)) && (!(*it)->bOnlySingleInput_ || bSingleInput))
+                (*it)->callFunction();
         }
     }
@@ -195,8 +184,8 @@
             return;
 
-        for (std::list<InputBufferListenerTuple>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
-        {
-            if ((*it).trueKeyFalseChar_ && ((*it).key_ == evt.key))
-                (*(*it).listener_.*(*it).function_)();
+        for (std::list<BaseInputBufferListenerTuple*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
+        {
+            if ((*it)->trueKeyFalseChar_ && ((*it)->key_ == evt.key))
+                (*it)->callFunction();
         }
 
Index: /code/branches/network/src/core/InputBuffer.h
===================================================================
--- /code/branches/network/src/core/InputBuffer.h	(revision 1485)
+++ /code/branches/network/src/core/InputBuffer.h	(revision 1486)
@@ -40,20 +40,39 @@
 namespace orxonox
 {
-    class _CoreExport InputBufferListener
-    {};
+    class BaseInputBufferListenerTuple
+    {
+    public:
+        BaseInputBufferListenerTuple(bool bListenToAllChanges, bool bOnlySingleInput,
+            bool trueKeyFalseChar, char _char, KeyCode::Enum key)
+            : bListenToAllChanges_(bListenToAllChanges), bOnlySingleInput_(bOnlySingleInput),
+              trueKeyFalseChar_(trueKeyFalseChar), char_(_char), key_(key)
+        { }
+        virtual void callFunction() = 0;
+        bool bListenToAllChanges_;
+        bool bOnlySingleInput_;
+        bool trueKeyFalseChar_;
+        char char_;
+        KeyCode::Enum key_;
+    };
+
+    template <class T>
+    class InputBufferListenerTuple : public BaseInputBufferListenerTuple
+    {
+    public:
+        InputBufferListenerTuple(T* listener, void (T::*function)(), bool bListenToAllChanges,
+            bool bOnlySingleInput, bool trueKeyFalseChar, char _char, KeyCode::Enum key)
+            : BaseInputBufferListenerTuple(bListenToAllChanges, bOnlySingleInput, trueKeyFalseChar, _char, key),
+              listener_(listener), function_(function)
+        { }
+        void InputBufferListenerTuple::callFunction()
+        {
+            (listener_->*function_)();
+        }
+        T* listener_;
+        void (T::*function_)();
+    };
 
     class _CoreExport InputBuffer : public KeyHandler, public OrxonoxClass
     {
-        struct InputBufferListenerTuple
-        {
-            InputBufferListener* listener_;
-            void (InputBufferListener::*function_)();
-            bool bListenToAllChanges_;
-            bool bOnlySingleInput_;
-            bool trueKeyFalseChar_;
-            char char_;
-            KeyCode::Enum key_;
-        };
-
         public:
             InputBuffer();
@@ -65,32 +84,24 @@
             void registerListener(T* listener, void (T::*function)(), bool bOnlySingleInput)
             {
-                struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned};
-                // TODO: this is a major hack!!!
-                // Fix it properly
-                *((int*)(&newListener.listener_)) = (int)(listener);
-
-                this->listeners_.insert(this->listeners_.end(), newListener);
+                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned);
+                this->listeners_.insert(this->listeners_.end(), newTuple);
             }
             template <class T>
             void registerListener(T* listener, void (T::*function)() const, bool bOnlySingleInput)
             {
-                struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned};
-                *((int*)(&newListener.listener_)) = (int)(listener);
-                this->listeners_.insert(this->listeners_.end(), newListener);
+                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned);
+                this->listeners_.insert(this->listeners_.end(), newTuple);
             }
-
             template <class T>
             void registerListener(T* listener, void (T::*function)(), char _char, bool bOnlySingleInput)
             {
-                struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned};
-                *((int*)(&newListener.listener_)) = (int)(listener);
-                this->listeners_.insert(this->listeners_.end(), newListener);
+                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned);
+                this->listeners_.insert(this->listeners_.end(), newTuple);
             }
             template <class T>
             void registerListener(T* listener, void (T::*function)() const, char _char, bool bOnlySingleInput)
             {
-                struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned};
-                *((int*)(&newListener.listener_)) = (int)(listener);
-                this->listeners_.insert(this->listeners_.end(), newListener);
+                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned);
+                this->listeners_.insert(this->listeners_.end(), newTuple);
             }
 
@@ -98,17 +109,26 @@
             void registerListener(T* listener, void (T::*function)(), KeyCode::Enum key)
             {
-                struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, true, true, '\0', key};
-                *((int*)(&newListener.listener_)) = (int)(listener);
-                this->listeners_.insert(this->listeners_.end(), newListener);
+                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, true, true, '\0', key);
+                this->listeners_.insert(this->listeners_.end(), newTuple);
             }
             template <class T>
             void registerListener(T* listener, void (T::*function)() const, KeyCode::Enum key)
             {
-                struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, true, true, '\0', key};
-                *((int*)(&newListener.listener_)) = (int)(listener);
-                this->listeners_.insert(this->listeners_.end(), newListener);
+                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, true, true, '\0', key);
+                this->listeners_.insert(this->listeners_.end(), newTuple);
             }
 
-            void unregisterListener(InputBufferListener* listener);
+            template <class T>
+            void unregisterListener(T* listener)
+            {
+                for (std::list<BaseInputBufferListenerTuple*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); )
+                {
+                    InputBufferListenerTuple<T>* refListener = dynamic_cast<InputBufferListenerTuple<T>*>(*it);
+                    if (refListener && refListener->listener_ == listener)
+                        this->listeners_.erase(it++);
+                    else
+                        it++;
+                }
+            }
 
             void set(const std::string& input, bool update = true);
@@ -151,5 +171,5 @@
 
             std::string buffer_;
-            std::list<InputBufferListenerTuple> listeners_;
+            std::list<BaseInputBufferListenerTuple*> listeners_;
             std::string allowedChars_;
             unsigned int cursor_;
Index: /code/branches/network/src/core/Shell.h
===================================================================
--- /code/branches/network/src/core/Shell.h	(revision 1485)
+++ /code/branches/network/src/core/Shell.h	(revision 1486)
@@ -57,5 +57,5 @@
     };
 
-    class _CoreExport Shell : virtual public OrxonoxClass, public InputBufferListener, public OutputBufferListener
+    class _CoreExport Shell : virtual public OrxonoxClass, public OutputBufferListener
     {
         public:
Index: /code/branches/network/src/orxonox/GraphicsEngine.cc
===================================================================
--- /code/branches/network/src/orxonox/GraphicsEngine.cc	(revision 1485)
+++ /code/branches/network/src/orxonox/GraphicsEngine.cc	(revision 1486)
@@ -149,5 +149,7 @@
 #endif
 
-/*    // create a logManager
+// TODO: LogManager doesn't work on specific systems. The why is unknown yet.
+#if ORXONOX_PLATFORM == ORXONOX_PLATFORM_WIN32
+    // create a logManager
     // note: If there's already a logManager, Ogre will complain by a failed assertation.
     // but that shouldn't happen, since this is the first time to create a logManager..
@@ -164,5 +166,6 @@
 
     myLog->setLogDetail(Ogre::LL_BOREME);
-    myLog->addListener(this);*/
+    myLog->addListener(this);
+#endif
 
     // Root will detect that we've already created a Log
Index: /code/branches/network/src/orxonox/objects/Model.cc
===================================================================
--- /code/branches/network/src/orxonox/objects/Model.cc	(revision 1485)
+++ /code/branches/network/src/orxonox/objects/Model.cc	(revision 1486)
@@ -85,5 +85,5 @@
 
         //HACK!!
-        if ((this->meshSrc_ == "assff.mesh") || (this->meshSrc_ == "ast1.mesh") || (this->meshSrc_ == "ast2.mesh") || (this->meshSrc_ == "ast3.mesh") || (this->meshSrc_ == "ast4.mesh") ||(this->meshSrc_ == "ast5.mesh") || (this->meshSrc_ == "ast6.mesh"))
+        /*if ((this->meshSrc_ == "assff.mesh") || (this->meshSrc_ == "ast1.mesh") || (this->meshSrc_ == "ast2.mesh") || (this->meshSrc_ == "ast3.mesh") || (this->meshSrc_ == "ast4.mesh") ||(this->meshSrc_ == "ast5.mesh") || (this->meshSrc_ == "ast6.mesh"))
         {
           Ogre::MeshPtr pMesh = this->mesh_.getEntity()->getMesh();
@@ -104,5 +104,5 @@
 
 
-        }
+        }*/
         COUT(4) << "Loader (Model.cc): Created model" << std::endl;
       }
