Index: code/branches/Presentation_HS16/src/modules/dodgerace/DodgeRace.cc
===================================================================
--- code/branches/Presentation_HS16/src/modules/dodgerace/DodgeRace.cc	(revision 11338)
+++ code/branches/Presentation_HS16/src/modules/dodgerace/DodgeRace.cc	(revision 11339)
@@ -36,4 +36,5 @@
 #include "DodgeRaceCube.h"
 #include "core/CoreIncludes.h"
+#include "Highscore.h"
 
 namespace orxonox
@@ -224,4 +225,10 @@
         // It will misteriously crash the game!
         // Instead startMainMenu, this won't crash.
+        if (Highscore::exists()){
+                    int score = this->getPoints();
+                    if(score > Highscore::getInstance().getHighestScoreOfGame("Dodge Race")) 
+                        Highscore::getInstance().storeHighscore("Dodge Race",score);
+
+          }
         GSLevel::startMainMenu();
     }
Index: code/branches/Presentation_HS16/src/modules/invader/Invader.cc
===================================================================
--- code/branches/Presentation_HS16/src/modules/invader/Invader.cc	(revision 11338)
+++ code/branches/Presentation_HS16/src/modules/invader/Invader.cc	(revision 11339)
@@ -33,5 +33,5 @@
 
 #include "Invader.h"
-
+#include "Highscore.h"
 #include "core/CoreIncludes.h"
 #include "core/EventIncludes.h"
@@ -189,4 +189,10 @@
         // It will misteriously crash the game!
         // Instead startMainMenu, this won't crash.
+        if (Highscore::exists()){
+                    int score = this->getPoints();
+                    if(score > Highscore::getInstance().getHighestScoreOfGame("Orxonox Arcade")) 
+                        Highscore::getInstance().storeHighscore("Orxonox Arcade",score);
+
+          }
         GSLevel::startMainMenu();
     }
Index: code/branches/Presentation_HS16/src/modules/jump/Jump.cc
===================================================================
--- code/branches/Presentation_HS16/src/modules/jump/Jump.cc	(revision 11338)
+++ code/branches/Presentation_HS16/src/modules/jump/Jump.cc	(revision 11339)
@@ -34,4 +34,5 @@
 #include "Jump.h"
 #include "core/CoreIncludes.h"
+#include "Highscore.h"
 
 #include "JumpCenterpoint.h"
@@ -311,5 +312,10 @@
         cleanup();
         GSLevel::startMainMenu();
-
+        if (Highscore::exists()){
+                    int score = this->getScore(this->getPlayer());
+                    if(score > Highscore::getInstance().getHighestScoreOfGame("Jump")) 
+                        Highscore::getInstance().storeHighscore("Jump",score);
+
+          }
         Deathmatch::end();
     }
Index: code/branches/Presentation_HS16/src/modules/tetris/Tetris.cc
===================================================================
--- code/branches/Presentation_HS16/src/modules/tetris/Tetris.cc	(revision 11338)
+++ code/branches/Presentation_HS16/src/modules/tetris/Tetris.cc	(revision 11339)
@@ -39,4 +39,5 @@
 
 #include "Tetris.h"
+#include "Highscore.h"
 
 #include "core/CoreIncludes.h"
@@ -327,5 +328,10 @@
             this->player_->stopControl();
         }
-
+         if (Highscore::exists()){
+                    int score = this->getScore(this->getPlayer());
+                    if(score > Highscore::getInstance().getHighestScoreOfGame("Tetris")) 
+                        Highscore::getInstance().storeHighscore("Tetris",score);
+
+          }
         this->cleanup();
 
Index: code/branches/Presentation_HS16/src/modules/towerdefense/TowerDefense.cc
===================================================================
--- code/branches/Presentation_HS16/src/modules/towerdefense/TowerDefense.cc	(revision 11338)
+++ code/branches/Presentation_HS16/src/modules/towerdefense/TowerDefense.cc	(revision 11339)
@@ -81,4 +81,5 @@
 #include "chat/ChatManager.h"
 #include "core/CoreIncludes.h"
+#include "Highscore.h"
 
 namespace orxonox
@@ -197,5 +198,10 @@
     void TowerDefense::end()
     {
-
+        if (Highscore::exists()){
+                    int score = this->getWaveNumber();
+                    if(score > Highscore::getInstance().getHighestScoreOfGame("Tower Defense")) 
+                        Highscore::getInstance().storeHighscore("Tower Defense",score);
+
+          }
         TeamDeathmatch::end();
         ChatManager::message("Match is over! Gameover!");
Index: code/branches/Presentation_HS16/src/orxonox/CMakeLists.txt
===================================================================
--- code/branches/Presentation_HS16/src/orxonox/CMakeLists.txt	(revision 11338)
+++ code/branches/Presentation_HS16/src/orxonox/CMakeLists.txt	(revision 11339)
@@ -28,4 +28,5 @@
   LevelInfo.cc
   LevelManager.cc
+  Highscore.cc
   Main.cc
   MoodManager.cc
@@ -61,4 +62,5 @@
     LevelInfo.h
     LevelManager.h
+    Highscore.h
     MoodManager.h
     controllers/HumanController.h
Index: code/branches/Presentation_HS16/src/orxonox/Highscore.cc
===================================================================
--- code/branches/Presentation_HS16/src/orxonox/Highscore.cc	(revision 11339)
+++ code/branches/Presentation_HS16/src/orxonox/Highscore.cc	(revision 11339)
@@ -0,0 +1,58 @@
+#include "Highscore.h"
+
+#include <vector>
+#include "core/CoreIncludes.h"
+#include "core/config/ConfigValueIncludes.h"
+#include "core/singleton/ScopedSingletonIncludes.h"
+
+namespace orxonox
+{
+
+    ManageScopedSingleton(Highscore, ScopeID::ROOT, false);
+	RegisterClassNoArgs(Highscore);
+
+	Highscore::Highscore()
+    {
+        RegisterObject(Highscore);
+        this->setConfigValues();
+    }
+    /**
+     * @brief set the config values in the orxonox.ini file
+     */
+    void Highscore::setConfigValues()
+    {
+        SetConfigValue(highscores_, std::vector<std::string>()).description("Highscores saved as vector");
+        SetConfigValue(playerName_, "Player").description("Name of the player");
+    }
+    /**
+     * @brief Returns highest score of given game, if exists.
+     * Else returns -1.
+     */
+    int Highscore::getHighestScoreOfGame(std::string game){
+        std::string delimiter = "./."; //score save as "Playername./.game./.score"
+        int best = -1;
+        //check for the highest Score of given game
+        for (std::string score : this->highscores_)
+        {
+            //filter the game string from given highscore
+            score.erase(0, score.find(delimiter) + delimiter.length());
+            if(game.compare(score.substr(0,score.find(delimiter))) == 0){
+                score.erase(0, score.find(delimiter) + delimiter.length());
+                int possibleBest = std::stoi(score);
+                if(possibleBest > best) best = possibleBest;
+            }
+
+
+        }
+        
+        return best;
+        
+    }
+    /**
+     * @brief stores a new highscore in the orxonox.ini file
+     */
+    void Highscore::storeHighscore(std::string level, int points){
+        ModifyConfigValue(highscores_, add, playerName_+"./."+level+"./."+std::to_string(points));
+    }
+    
+}
Index: code/branches/Presentation_HS16/src/orxonox/Highscore.h
===================================================================
--- code/branches/Presentation_HS16/src/orxonox/Highscore.h	(revision 11339)
+++ code/branches/Presentation_HS16/src/orxonox/Highscore.h	(revision 11339)
@@ -0,0 +1,39 @@
+#include <string>
+#include "core/config/Configurable.h"
+#include "OrxonoxPrereqs.h"
+#include "util/Singleton.h"
+// tolua_begin
+namespace orxonox
+{
+class _OrxonoxExport Highscore 
+// tolua_end
+ : public Singleton<Highscore>, public Configurable
+{ //tolua_export
+    friend class Singleton<Highscore>;
+    public:
+        Highscore();              // Constructor
+        void setConfigValues(); // Inherited function
+        void storeHighscore(std::string level, int points);
+
+        int getHighestScoreOfGame(std::string game);
+        // tolua_begin
+        inline unsigned int getNumberOfHighscores()
+                { return this->highscores_.size(); }
+            inline const std::string& getHighscore(unsigned int index)
+                { return this->highscores_[index]; }
+
+        static Highscore& getInstance()
+                { return Singleton<Highscore>::getInstance(); }
+
+        // tolua_end 
+
+
+    private:
+        std::vector<std::string> highscores_;
+        float version_;
+        std::string playerName_;
+        static Highscore* singletonPtr_s;
+}; //tolua_export
+
+
+} //tolua_export
Index: code/branches/Presentation_HS16/src/orxonox/LevelInfo.cc
===================================================================
--- code/branches/Presentation_HS16/src/orxonox/LevelInfo.cc	(revision 11338)
+++ code/branches/Presentation_HS16/src/orxonox/LevelInfo.cc	(revision 11339)
@@ -151,4 +151,14 @@
     }
 
+    bool LevelInfoItem::addHighscore(const std::string& name, const int score)
+    {
+        std::stringstream stream;
+        stream << name << "/:/" << score;
+        bool success = this->highscores_.insert(stream.str()).second;
+        if(success)
+            this->highscoresUpdated();
+        return success;
+    }
+
     /**
     @brief
@@ -191,4 +201,19 @@
     }
 
+    void LevelInfoItem::highscoresUpdated(void)
+    {
+        std::stringstream stream;
+        std::set<std::string>::iterator temp;
+        for(std::set<std::string>::iterator it = this->highscores_.begin(); it != this->highscores_.end(); )
+        {
+            temp = it;
+            if(++it == this->highscores_.end()) // If this is the last tag we don't add a comma.
+                stream << *temp;
+            else
+                stream << *temp << ", ";
+        }
+
+        this->highscoresString_ = std::string(stream.str());
+    }
     /**
     @brief
Index: code/branches/Presentation_HS16/src/orxonox/LevelInfo.h
===================================================================
--- code/branches/Presentation_HS16/src/orxonox/LevelInfo.h	(revision 11338)
+++ code/branches/Presentation_HS16/src/orxonox/LevelInfo.h	(revision 11339)
@@ -118,4 +118,8 @@
             inline bool hasTag(const std::string& tag) const { return this->tags_.find(tag) != this->tags_.end(); } // tolua_export
 
+            bool addHighscore(const std::string& name,const int score);
+
+            inline const std::string& getHighscores(void) const { return this->highscoresString_; } // tolua_export
+
             void setStartingShips(const std::string& ships); //!< Set the starting ship models of the level
             bool addStartingShip(const std::string& ship, bool update = true); //!< Add a model to shipselection
@@ -154,4 +158,5 @@
             void startingshipsUpdated(void); //!< Updates the comma-seperated string of all possible starting ships.
             void tagsUpdated(void); //!< Updates the comma-seperated string of all tags, if the set of tags has changed.
+            void highscoresUpdated(void);
             static void initializeTags(void); //!< Initialize the set of allowed tags.
             /**
@@ -170,4 +175,8 @@
             std::string screenshot_; //!< The screenshot of the Level.
             std::set<std::string> tags_; //!< The set of tags the Level is tagged with.
+
+            std::set<std::string> highscores_; 
+            std::string highscoresString_;
+
             std::string tagsString_; //!< The comma-seperated string of all the tags the Level is tagged with.
             std::set<std::string> startingShips_; //!< The set of starting ship models the Level allows.
@@ -244,4 +253,7 @@
             inline const std::string& getTags(void) const
                 { return this->LevelInfoItem::getTags(); }
+
+            inline const std::string& getHighscores(void) const
+                { return this->LevelInfoItem::getHighscores(); }
             /**
             @brief Set the starting ship models of the level
