Index: code/trunk/src/orxonox/LevelManager.cc
===================================================================
--- code/trunk/src/orxonox/LevelManager.cc	(revision 5693)
+++ code/trunk/src/orxonox/LevelManager.cc	(revision 5695)
@@ -30,5 +30,5 @@
 
 #include <map>
-#include <boost/filesystem.hpp>
+#include <OgreResourceGroupManager.h>
 
 #include "core/CommandLine.h"
@@ -135,17 +135,16 @@
         availableLevels_.clear();
 
-        boost::filesystem::directory_iterator file(Core::getMediaPathString() + "levels");
-        boost::filesystem::directory_iterator end;
+        availableLevels_ = *Ogre::ResourceGroupManager::getSingleton().findResourceNames(
+            Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "*.oxw");
 
-        while (file != end)
-        {
-            if (!boost::filesystem::is_directory(*file) && file->string()[file->string().length()-1] != '~')
+        for (std::vector<std::string>::iterator it = availableLevels_.begin(); it != availableLevels_.end();)
+            if (it->find("old/") == 0)
+                it = availableLevels_.erase(it);
+            else
             {
-                std::string filename = file->path().leaf();
-                if (filename.length() > 4)
-                    availableLevels_.push_back(filename.substr(0,filename.length()-4));
+                size_t pos = it->find(".oxw");
+                *it = it->substr(0, pos);
+                ++it;
             }
-            ++file;
-        }
     }
 }
Index: code/trunk/src/orxonox/Main.cc
===================================================================
--- code/trunk/src/orxonox/Main.cc	(revision 5693)
+++ code/trunk/src/orxonox/Main.cc	(revision 5695)
@@ -40,4 +40,6 @@
 #include "core/CommandLine.h"
 #include "core/Game.h"
+#include "core/LuaState.h"
+#include "ToluaBindOrxonox.h"
 #include "Main.h"
 
@@ -48,4 +50,6 @@
 SetCommandLineSwitch(dedicated).information("Start in dedicated server mode");
 SetCommandLineSwitch(standalone).information("Start in standalone mode");
+
+DeclareToluaInterface(Orxonox);
 
 namespace orxonox
Index: code/trunk/src/orxonox/gamestates/GSDedicated.cc
===================================================================
--- code/trunk/src/orxonox/gamestates/GSDedicated.cc	(revision 5693)
+++ code/trunk/src/orxonox/gamestates/GSDedicated.cc	(revision 5695)
@@ -28,4 +28,8 @@
 
 #include "GSDedicated.h"
+
+#include <iomanip>
+#include <iostream>
+#include <boost/bind.hpp>
 
 #include "util/Debug.h"
@@ -37,8 +41,4 @@
 #include "core/GameMode.h"
 #include "network/Server.h"
-
-#include <iostream>
-#include <iomanip>
-#include <boost/bind.hpp>
 
 #ifdef ORXONOX_PLATFORM_UNIX
Index: code/trunk/src/orxonox/gamestates/GSGraphics.cc
===================================================================
--- code/trunk/src/orxonox/gamestates/GSGraphics.cc	(revision 5693)
+++ code/trunk/src/orxonox/gamestates/GSGraphics.cc	(revision 5695)
@@ -96,5 +96,5 @@
         // load debug overlay
         COUT(3) << "Loading Debug Overlay..." << std::endl;
-        this->debugOverlay_ = new XMLFile(Core::getMediaPathString() + "overlay/debug.oxo");
+        this->debugOverlay_ = new XMLFile("debug.oxo");
         Loader::open(debugOverlay_);
 
Index: code/trunk/src/orxonox/gamestates/GSLevel.cc
===================================================================
--- code/trunk/src/orxonox/gamestates/GSLevel.cc	(revision 5693)
+++ code/trunk/src/orxonox/gamestates/GSLevel.cc	(revision 5695)
@@ -29,4 +29,6 @@
 
 #include "GSLevel.h"
+
+#include <OgreCompositorManager.h>
 
 #include "core/input/InputManager.h"
@@ -166,4 +168,9 @@
 */
 
+        if (GameMode::showsGraphics())
+        {
+            // unload all compositors (this is only necessary because we don't yet destroy all resources!)
+            Ogre::CompositorManager::getSingleton().removeAll();
+        }
 
         // this call will delete every BaseObject!
@@ -229,5 +236,5 @@
         // call the loader
         COUT(0) << "Loading level..." << std::endl;
-        startFile_s = new XMLFile(Core::getMediaPathString() + "levels" + '/' + LevelManager::getInstance().getDefaultLevel());
+        startFile_s = new XMLFile(LevelManager::getInstance().getDefaultLevel());
         Loader::open(startFile_s);
     }
Index: code/trunk/src/orxonox/gamestates/GSMainMenu.cc
===================================================================
--- code/trunk/src/orxonox/gamestates/GSMainMenu.cc	(revision 5693)
+++ code/trunk/src/orxonox/gamestates/GSMainMenu.cc	(revision 5695)
@@ -52,4 +52,5 @@
         inputState_->setHandler(GUIManager::getInstancePtr());
         inputState_->setJoyStickHandler(&InputHandler::EMPTY);
+        inputState_->setIsExclusiveMouse(false);
 
         // create an empty Scene
@@ -70,5 +71,5 @@
     {
         // show main menu
-        GUIManager::getInstance().showGUI("mainmenu_4");
+        GUIManager::getInstance().showGUI("MainMenu");
         GUIManager::getInstance().setCamera(this->camera_);
         GraphicsManager::getInstance().setCamera(this->camera_);
Index: code/trunk/src/orxonox/gamestates/GSRoot.cc
===================================================================
--- code/trunk/src/orxonox/gamestates/GSRoot.cc	(revision 5693)
+++ code/trunk/src/orxonox/gamestates/GSRoot.cc	(revision 5695)
@@ -33,8 +33,5 @@
 #include "core/Game.h"
 #include "core/GameMode.h"
-#include "core/LuaBind.h"
 #include "network/NetworkFunction.h"
-#include "ToluaBindCore.h"
-#include "ToluaBindOrxonox.h"
 #include "tools/Timer.h"
 #include "tools/interfaces/TimeFactorListener.h"
@@ -54,8 +51,4 @@
         this->ccSetTimeFactor_ = 0;
         this->ccPause_ = 0;
-
-        // Tell LuaBind about all tolua interfaces
-        LuaBind::getInstance().addToluaInterface(&tolua_Core_open, "Core");
-        LuaBind::getInstance().addToluaInterface(&tolua_Orxonox_open, "Orxonox");
     }
 
@@ -86,5 +79,5 @@
         }
 
-        // create the global LevelManager
+        // create the LevelManager
         this->levelManager_ = new LevelManager();
     }
Index: code/trunk/src/orxonox/objects/Level.cc
===================================================================
--- code/trunk/src/orxonox/objects/Level.cc	(revision 5693)
+++ code/trunk/src/orxonox/objects/Level.cc	(revision 5695)
@@ -53,7 +53,4 @@
         this->registerVariables();
         this->xmlfilename_ = this->getFilename();
-
-        if (this->xmlfilename_.length() >= Core::getMediaPathString().length())
-            this->xmlfilename_ = this->xmlfilename_.substr(Core::getMediaPathString().length());
     }
 
@@ -101,5 +98,5 @@
         mask.include(Class(OverlayGroup)); // HACK to include the ChatOverlay
 
-        this->xmlfile_ = new XMLFile(Core::getMediaPathString() + this->xmlfilename_, mask);
+        this->xmlfile_ = new XMLFile(mask, this->xmlfilename_);
 
         Loader::open(this->xmlfile_);
Index: code/trunk/src/orxonox/objects/Script.cc
===================================================================
--- code/trunk/src/orxonox/objects/Script.cc	(revision 5693)
+++ code/trunk/src/orxonox/objects/Script.cc	(revision 5695)
@@ -29,40 +29,36 @@
 #include "Script.h"
 
-#include <tinyxml/ticpp.h>
 #include "core/CoreIncludes.h"
-#include "core/LuaBind.h"
+#include "core/LuaState.h"
+#include "core/XMLPort.h"
 
 namespace orxonox
 {
-  CreateFactory(Script);
+    CreateFactory(Script);
 
-  Script::Script(BaseObject* creator) : BaseObject(creator)
-  {
-    RegisterObject(Script);
+    Script::Script(BaseObject* creator) : BaseObject(creator)
+    {
+        RegisterObject(Script);
 
-    code_ = "";
-  }
+        // Get a new LuaState
+        luaState_ = new LuaState();
+    }
 
-  Script::~Script()
-  {
-  }
+    Script::~Script()
+    {
+        if (this->isInitialized())
+            delete luaState_;
+    }
 
-  /**
-  @brief XML loading and saving.
-  @param xmlelement The XML-element
-  @param loading Loading (true) or saving (false)
-   */
-  void Script::XMLPort(Element& xmlelement, XMLPort::Mode mode)
-  {
-    BaseObject::XMLPort(xmlelement, mode);
+    void Script::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        BaseObject::XMLPort(xmlelement, mode);
 
-    code_ = xmlelement.GetText(false);
-  }
+        XMLPortParam(Script, "code", setCode, getCode, xmlelement, mode);
+    }
 
-  void Script::execute()
-  {
-    LuaBind& lua = LuaBind::getInstance();
-    lua.loadString(this->code_);
-    lua.run();
-  }
+    void Script::execute()
+    {
+        luaState_->doString(code_);
+    }
 }
Index: code/trunk/src/orxonox/objects/Script.h
===================================================================
--- code/trunk/src/orxonox/objects/Script.h	(revision 5693)
+++ code/trunk/src/orxonox/objects/Script.h	(revision 5695)
@@ -37,15 +37,19 @@
 namespace orxonox
 {
-  class _OrxonoxExport Script : public BaseObject
-  {
+    class _OrxonoxExport Script : public BaseObject
+    {
     public:
-      Script(BaseObject* creator);
-      ~Script();
-      void XMLPort(Element& xmlelement, XMLPort::Mode mode);
-      void execute();
+        Script(BaseObject* creator);
+        ~Script();
+        void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+        void execute();
+
+        void setCode(const std::string& code) { code_ = code; }
+        const std::string& getCode() const { return code_; }
 
     private:
-      std::string code_;
-  };
+        std::string code_;
+        LuaState* luaState_;
+    };
 }
 
Index: code/trunk/src/orxonox/orxonox-main.vcproj.user.in
===================================================================
--- code/trunk/src/orxonox/orxonox-main.vcproj.user.in	(revision 5693)
+++ code/trunk/src/orxonox/orxonox-main.vcproj.user.in	(revision 5695)
@@ -11,5 +11,5 @@
 			<DebugSettings
 				WorkingDirectory="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$(OutDir)"
-				Environment="Path=${ORXONOX_RUNTIME_LIBRARY_DIRECTORY}"
+				Environment="Path=${RUNTIME_LIBRARY_DIRECTORY}"
 				EnvironmentMerge="true"
 			/>
@@ -20,5 +20,5 @@
 			<DebugSettings
 				WorkingDirectory="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$(OutDir)"
-				Environment="Path=${ORXONOX_RUNTIME_LIBRARY_DIRECTORY}"
+				Environment="Path=${RUNTIME_LIBRARY_DIRECTORY}"
 				EnvironmentMerge="true"
 			/>
@@ -29,5 +29,5 @@
 			<DebugSettings
 				WorkingDirectory="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$(OutDir)"
-				Environment="Path=${ORXONOX_RUNTIME_LIBRARY_DIRECTORY}"
+				Environment="Path=${RUNTIME_LIBRARY_DIRECTORY}"
 				EnvironmentMerge="true"
 			/>
@@ -38,5 +38,5 @@
 			<DebugSettings
 				WorkingDirectory="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$(OutDir)"
-				Environment="Path=${ORXONOX_RUNTIME_LIBRARY_DIRECTORY}"
+				Environment="Path=${RUNTIME_LIBRARY_DIRECTORY}"
 				EnvironmentMerge="true"
 			/>
Index: code/trunk/src/orxonox/sound/SoundBase.cc
===================================================================
--- code/trunk/src/orxonox/sound/SoundBase.cc	(revision 5693)
+++ code/trunk/src/orxonox/sound/SoundBase.cc	(revision 5695)
@@ -36,4 +36,5 @@
 #include "util/Math.h"
 #include "core/Core.h"
+#include "core/Resource.h"
 #include "orxonox/objects/worldentities/WorldEntity.h"
 #include "SoundManager.h"
@@ -134,7 +135,5 @@
     }
 
-    bool SoundBase::loadFile(std::string filename) {
-        filename = Core::getMediaPathString() + "/audio/" + filename;
-
+    bool SoundBase::loadFile(const std::string& filename) {
         if(!SoundManager::getInstance().isSoundAvailable())
         {
@@ -144,5 +143,18 @@
 
         COUT(3) << "Sound: OpenAL ALUT: loading file " << filename << std::endl;
-        this->buffer_ = alutCreateBufferFromFile(filename.c_str());
+        // Get DataStream from the resources
+        shared_ptr<ResourceInfo> fileInfo = Resource::getInfo(filename);
+        if (fileInfo == NULL) {
+            COUT(2) << "Warning: Sound file '" << filename << "' not found" << std::endl;
+            return false;
+        }
+        DataStreamPtr stream = Resource::open(filename);
+        // Read everything into a temporary buffer
+        char* buffer = new char[fileInfo->size];
+        stream->read(buffer, fileInfo->size);
+
+        this->buffer_ = alutCreateBufferFromFileImage(buffer, fileInfo->size);
+        delete[] buffer;
+
         if(this->buffer_ == AL_NONE) {
             COUT(2) << "Sound: OpenAL ALUT: " << alutGetErrorString(alutGetError()) << std::endl;
Index: code/trunk/src/orxonox/sound/SoundBase.h
===================================================================
--- code/trunk/src/orxonox/sound/SoundBase.h	(revision 5693)
+++ code/trunk/src/orxonox/sound/SoundBase.h	(revision 5695)
@@ -55,5 +55,5 @@
         bool isStopped();
 
-        bool loadFile(std::string filename);
+        bool loadFile(const std::string& filename);
 
     private:
Index: code/trunk/src/orxonox/tools/CMakeLists.txt
===================================================================
--- code/trunk/src/orxonox/tools/CMakeLists.txt	(revision 5693)
+++ code/trunk/src/orxonox/tools/CMakeLists.txt	(revision 5695)
@@ -5,4 +5,6 @@
   Mesh.cc
   ParticleInterface.cc
+  ResourceCollection.cc
+  ResourceLocation.cc
   Shader.cc
   TextureGenerator.cc
Index: code/trunk/src/orxonox/tools/Mesh.cc
===================================================================
--- code/trunk/src/orxonox/tools/Mesh.cc	(revision 5693)
+++ code/trunk/src/orxonox/tools/Mesh.cc	(revision 5695)
@@ -71,4 +71,5 @@
                 this->entity_->setCastShadows(this->bCastShadows_);
 
+#if OGRE_VERSION < 0x010600
                 this->entity_->setNormaliseNormals(true);
                 /*
@@ -79,4 +80,5 @@
                     I don't know exactly what this means, but I put this here if there will be problems with shaders.
                 */
+#endif
             }
             catch (...)
Index: code/trunk/src/orxonox/tools/ResourceCollection.cc
===================================================================
--- code/trunk/src/orxonox/tools/ResourceCollection.cc	(revision 5695)
+++ code/trunk/src/orxonox/tools/ResourceCollection.cc	(revision 5695)
@@ -0,0 +1,99 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Reto Grieder
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "ResourceCollection.h"
+
+#include "util/Exception.h"
+#include "core/CoreIncludes.h"
+#include "core/Resource.h"
+#include "core/XMLPort.h"
+#include "ResourceLocation.h"
+
+namespace orxonox
+{
+    CreateFactory(ResourceCollection);
+
+    ResourceCollection::ResourceCollection(BaseObject* creator)
+        : BaseObject(creator)
+    {
+        RegisterObject(ResourceCollection);
+
+        // Default group is "General"
+        this->setResourceGroup(Resource::DEFAULT_GROUP);
+    }
+
+    ResourceCollection::~ResourceCollection()
+    {
+    }
+
+    void ResourceCollection::XMLPort(Element& xmlElement, XMLPort::Mode mode)
+    {
+        XMLPortParam(ResourceCollection, "resourceGroup", setResourceGroup, getResourceGroup, xmlElement, mode);
+        XMLPortObject(ResourceCollection, ResourceLocation, "", addResourceLocation, getResourceLocation, xmlElement, mode);
+    }
+
+    void ResourceCollection::setResourceGroup(const std::string& resourceGroup)
+    {
+        if (resourceGroup.empty())
+        {
+            COUT(2) << "Warning: \"\" is not a valid resource group." << std::endl;
+            return;
+        }
+        if (!resourceLocations_.empty())
+            ThrowException(InitialisationFailed, "ResourceGroup: Group change not allowed with locations already added!");
+        resourceGroup_ = resourceGroup;
+    }
+
+    void ResourceCollection::addResourceLocation(ResourceLocation* location)
+    {
+        location->load(resourceGroup_);
+        this->resourceLocations_.push_back(location);
+    }
+
+    void ResourceCollection::removeResourceLocation(ResourceLocation* location)
+    {
+        for (std::vector<ResourceLocation*>::iterator it = resourceLocations_.begin(); it != resourceLocations_.end(); )
+        {
+            if (*it == location)
+            {
+                it = resourceLocations_.erase(it);
+                location->unload(); // doesn't throw
+            }
+            else
+                ++it;
+        }
+    }
+
+    ResourceLocation* ResourceCollection::getResourceLocation(unsigned int index) const
+    {
+        if (index >= resourceLocations_.size())
+            return NULL;
+        else
+            return resourceLocations_[index];
+    }
+}
Index: code/trunk/src/orxonox/tools/ResourceCollection.h
===================================================================
--- code/trunk/src/orxonox/tools/ResourceCollection.h	(revision 5695)
+++ code/trunk/src/orxonox/tools/ResourceCollection.h	(revision 5695)
@@ -0,0 +1,65 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Reto Grieder
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _ResourceCollection_H__
+#define _ResourceCollection_H__
+
+#include "tools/ToolsPrereqs.h"
+
+#include <string>
+#include <vector>
+#include "core/BaseObject.h"
+
+namespace orxonox
+{
+    class ResourceLocation;
+
+    class _ToolsExport ResourceCollection : public BaseObject
+    {
+    public:
+        ResourceCollection(BaseObject* creator);
+        virtual ~ResourceCollection();
+
+        virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
+
+        void setResourceGroup(const std::string& resourceGroup);
+        const std::string& getResourceGroup() const { return resourceGroup_; }
+
+        void addResourceLocation(ResourceLocation* location);
+        void removeResourceLocation(ResourceLocation* location);
+        ResourceLocation* getResourceLocation(unsigned int index) const;
+
+    private:
+        ResourceCollection(const ResourceCollection&);
+
+        std::string resourceGroup_;
+        std::vector<ResourceLocation*> resourceLocations_;
+    };
+}
+
+#endif /* _ResourceCollection_H__ */
Index: code/trunk/src/orxonox/tools/ResourceLocation.cc
===================================================================
--- code/trunk/src/orxonox/tools/ResourceLocation.cc	(revision 5695)
+++ code/trunk/src/orxonox/tools/ResourceLocation.cc	(revision 5695)
@@ -0,0 +1,104 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Reto Grieder
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "ResourceLocation.h"
+
+#include <OgreResourceGroupManager.h>
+#include <boost/filesystem.hpp>
+
+#include "util/Exception.h"
+#include "core/Core.h"
+#include "core/CoreIncludes.h"
+#include "core/XMLFile.h"
+#include "core/XMLPort.h"
+
+namespace orxonox
+{
+    CreateFactory(ResourceLocation);
+
+    ResourceLocation::ResourceLocation(BaseObject* creator)
+        : BaseObject(creator)
+    {
+        RegisterObject(ResourceLocation);
+
+        // Default values
+        archiveType_ = "FileSystem";
+        bRecursive_  = true;
+    }
+
+    ResourceLocation::~ResourceLocation()
+    {
+    }
+
+    void ResourceLocation::XMLPort(Element& xmlElement, XMLPort::Mode mode)
+    {
+        XMLPortParam(ResourceLocation, "path",        setPath,        getPath,        xmlElement, mode);
+        XMLPortParam(ResourceLocation, "archiveType", setArchiveType, getArchiveType, xmlElement, mode);
+        XMLPortParam(ResourceLocation, "recursive",   setRecursive,   getRecursive,   xmlElement, mode);
+        if (path_.empty())
+            ThrowException(AbortLoading, "ResourceLocation: No path given.");
+    }
+
+    void ResourceLocation::load(const std::string& resourceGroup)
+    {
+        if (path_.empty())
+            ThrowException(InitialisationFailed, "ResourceLocation: Trying to add one without the path being set");
+
+        // Find the path
+        boost::filesystem::path path;
+        if (boost::filesystem::exists(Core::getDataPath() / this->getPath()))
+            path = Core::getDataPath() / this->getPath();
+        else if (Core::isDevelopmentRun() && boost::filesystem::exists(Core::getExternalDataPath() / this->getPath()))
+            path = Core::getExternalDataPath() / this->getPath();
+        else
+        {
+            COUT(2) << "Warning: ResourceLocation '" << this->getPath() << "' does not seem to exist" << std::endl;
+            return;
+        }
+
+        // Add it to the Ogre paths
+        Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
+            path.string(), this->getArchiveType(), resourceGroup, this->getRecursive());
+        resourceGroup_ = resourceGroup;
+    }
+
+    void ResourceLocation::unload()
+    {
+        // Remove from Ogre paths
+        resourceGroup_.erase();
+        try
+        {
+            Ogre::ResourceGroupManager::getSingleton().removeResourceLocation(
+                this->getPath(), this->getResourceGroup());
+        }
+        catch (const std::exception& ex)
+        {
+            COUT(1) << "Removing of a ResourceLocation failed: " << ex.what() << std::endl;
+        }
+    }
+}
Index: code/trunk/src/orxonox/tools/ResourceLocation.h
===================================================================
--- code/trunk/src/orxonox/tools/ResourceLocation.h	(revision 5695)
+++ code/trunk/src/orxonox/tools/ResourceLocation.h	(revision 5695)
@@ -0,0 +1,74 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Reto Grieder
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _ResourceLocation_H__
+#define _ResourceLocation_H__
+
+#include "tools/ToolsPrereqs.h"
+
+#include <string>
+#include "core/BaseObject.h"
+
+namespace orxonox
+{
+    class _ToolsExport ResourceLocation : public BaseObject
+    {
+        // for load/unload
+        friend class ResourceCollection;
+
+    public:
+        ResourceLocation(BaseObject* creator);
+        virtual ~ResourceLocation();
+
+        virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
+
+        void setPath(const std::string& path) { path_ = path; }
+        const std::string& getPath() const { return path_; }
+
+        void setArchiveType(const std::string& archiveType) { archiveType_ = archiveType; }
+        const std::string& getArchiveType() const { return archiveType_; }
+
+        void setRecursive(bool bRecursive) { bRecursive_ = bRecursive; }
+        bool getRecursive() const { return bRecursive_; }
+
+        const std::string& getResourceGroup() const { return resourceGroup_; }
+
+    private:
+        ResourceLocation(const ResourceLocation&);
+
+        void load(const std::string& resourceGroup);
+        void unload();
+
+        std::string path_;
+        std::string archiveType_;
+        std::string resourceGroup_;
+        bool bRecursive_;
+    };
+}
+
+#endif /* _ResourceLocation_H__ */
