Index: code/branches/FICN/CMakeLists.txt
===================================================================
--- code/branches/FICN/CMakeLists.txt	(revision 386)
+++ code/branches/FICN/CMakeLists.txt	(revision 389)
@@ -1,2 +1,3 @@
+
 PROJECT(Orxonox)
 #set some global variables, which are used throughout the project
@@ -50,7 +51,7 @@
 
 
+
 #This sets where to look for "Find*.cmake" files
 SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
-
 #Performs the search and sets the variables
 FIND_PACKAGE(OGRE)
@@ -60,25 +61,12 @@
 FIND_PACKAGE(ENet)
 FIND_PACKAGE(Boost)
+FIND_PACKAGE(OpenAL)
+FIND_PACKAGE(ALUT)
+# FIND_PACKAGE(OggVorbis)
 
-#Sets the search paths for the linker
-LINK_DIRECTORIES(
-  ${OGRE_LIB_DIR}
-  ${OIS_LIB_DIR}
-  ${CEGUI_LIB_DIR}
-  ${CEGUI_OGRE_LIB_DIR}
-  ${ENet_LIBRARY}
-  ${Boost_LIBRARY_DIRS}
-)
-
+#Sets the search paths for the linking
+LINK_DIRECTORIES(${OGRE_LIB_DIR} ${OIS_LIB_DIR} ${CEGUI_LIB_DIR} ${CEGUI_OGRE_LIB_DIR} ${ENet_LIBRARY} ${Boost_LIBRARY_DIRS} ${OPENAL_LIBRARY} ${ALUT_LIBRARY} core objects loader network weapon classHierarchy audio)
 #Sets the search path for include files
-INCLUDE_DIRECTORIES(
-  ${OGRE_INCLUDE_DIR}
-  ${OIS_INCLUDE_DIR}
-  ${CEGUI_INCLUDE_DIR}
-  ${CEGUI_OGRE_INCLUDE_DIR}
-  ${ENet_INCLUDE_DIR}
-  ${Boost_INCLUDE_DIRS}
-)
-
+INCLUDE_DIRECTORIES(${OGRE_INCLUDE_DIR} ${OIS_INCLUDE_DIR} ${CEGUI_INCLUDE_DIR} ${CEGUI_OGRE_INCLUDE_DIR} ${ENet_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${OPENAL_INCLUDE_DIR} ${ALUT_INCLUDE_DIR})
 
 #add main source dir
Index: code/branches/FICN/cmake/FindALUT.cmake
===================================================================
--- code/branches/FICN/cmake/FindALUT.cmake	(revision 389)
+++ code/branches/FICN/cmake/FindALUT.cmake	(revision 389)
@@ -0,0 +1,87 @@
+# - Locate FreeAlut
+# This module defines
+#  ALUT_LIBRARY
+#  ALUT_FOUND, if false, do not try to link to Alut
+#  ALUT_INCLUDE_DIR, where to find the headers
+#
+# $ALUTDIR is an environment variable that would
+# correspond to the ./configure --prefix=$ALUTDIR
+# used in building Alut.
+#
+# Created by Eric Wing. This was influenced by the FindSDL.cmake module.
+# On OSX, this will prefer the Framework version (if found) over others.
+# People will have to manually change the cache values of
+# ALUT_LIBRARY to override this selection.
+# Tiger will include OpenAL as part of the System.
+# But for now, we have to look around.
+# Other (Unix) systems should be able to utilize the non-framework paths.
+FIND_PATH(ALUT_INCLUDE_DIR AL/alut.h
+  $ENV{ALUTDIR}/include
+  ~/Library/Frameworks/OpenAL.framework/Headers
+  /Library/Frameworks/OpenAL.framework/Headers
+  /System/Library/Frameworks/OpenAL.framework/Headers # Tiger
+  /usr/pack/openal-0.0.8-cl/include # Tardis specific hack
+  /usr/local/include/
+  /usr/local/include/OpenAL
+  /usr/local/include
+  /usr/include/
+  /usr/include/OpenAL
+  /usr/include
+  /sw/include/ # Fink
+  /sw/include/OpenAL
+  /sw/include
+  /opt/local/include/AL # DarwinPorts
+  /opt/local/include/OpenAL
+  /opt/local/include
+  /opt/csw/include/ # Blastwave
+  /opt/csw/include/OpenAL
+  /opt/csw/include
+  /opt/include/
+  /opt/include/OpenAL
+  /opt/include
+  )
+# I'm not sure if I should do a special casing for Apple. It is
+# unlikely that other Unix systems will find the framework path.
+# But if they do ([Next|Open|GNU]Step?),
+# do they want the -framework option also?
+IF(${ALUT_INCLUDE_DIR} MATCHES ".framework")
+  STRING(REGEX REPLACE "(.*)/.*\\.framework/.*" "\\1" ALUT_FRAMEWORK_PATH_TMP ${ALUT_INCLUDE_DIR})
+  IF("${ALUT_FRAMEWORK_PATH_TMP}" STREQUAL "/Library/Frameworks"
+      OR "${ALUT_FRAMEWORK_PATH_TMP}" STREQUAL "/System/Library/Frameworks"
+      )
+    # String is in default search path, don't need to use -F
+    SET (ALUT_LIBRARY "-framework OpenAL" CACHE STRING "OpenAL framework for OSX")
+  ELSE("${ALUT_FRAMEWORK_PATH_TMP}" STREQUAL "/Library/Frameworks"
+      OR "${ALUT_FRAMEWORK_PATH_TMP}" STREQUAL "/System/Library/Frameworks"
+      )
+    # String is not /Library/Frameworks, need to use -F
+    SET(ALUT_LIBRARY "-F${ALUT_FRAMEWORK_PATH_TMP} -framework OpenAL" CACHE STRING "OpenAL framework for OSX")
+  ENDIF("${ALUT_FRAMEWORK_PATH_TMP}" STREQUAL "/Library/Frameworks"
+    OR "${ALUT_FRAMEWORK_PATH_TMP}" STREQUAL "/System/Library/Frameworks"
+    )
+  # Clear the temp variable so nobody can see it
+  SET(ALUT_FRAMEWORK_PATH_TMP "" CACHE INTERNAL "")
+
+ELSE(${ALUT_INCLUDE_DIR} MATCHES ".framework")
+  FIND_LIBRARY(ALUT_LIBRARY
+    NAMES alut
+    PATHS
+    $ENV{ALUTDIR}/lib
+    $ENV{ALUTDIR}/libs
+		/usr/pack/openal-0.0.8-cl/i686-debian-linux3.1/lib
+    /usr/local/lib
+    /usr/lib
+    /sw/lib
+    /opt/local/lib
+    /opt/csw/lib
+    /opt/lib
+    )
+ENDIF(${ALUT_INCLUDE_DIR} MATCHES ".framework")
+
+SET(ALUT_FOUND "NO")
+IF(ALUT_LIBRARY)
+  SET(ALUT_FOUND "YES")
+	MESSAGE(STATUS "FreeAlut was found. Libdir ${ALUT_LIBRARY} Includedir ${ALUT_INCLUDE_DIR}")
+ENDIF(ALUT_LIBRARY)
+
+
Index: code/branches/FICN/cmake/FindOggVorbis.cmake
===================================================================
--- code/branches/FICN/cmake/FindOggVorbis.cmake	(revision 389)
+++ code/branches/FICN/cmake/FindOggVorbis.cmake	(revision 389)
@@ -0,0 +1,6 @@
+
+SET(OGGVORBIS_LIBRARY_DIR "/usr/pack/oggvorbis-1.0-ds/i686-debian-linux3.0/lib")
+SET(OGGVORBIS_LIBRARY "${OGGVORBIS_LIBRARY_DIR}/libvorbisenc.so ${OGGVORBIS_LIBRARY_DIR}/libvorbisfile.so ${OGGVORBIS_LIBRARY_DIR}/libogg.so ${OGGVORBIS_LIBRARY_DIR}/libvorbis.so ")
+SET(OGGVORBIS_INCLUDE_DIR "/usr/pack/oggvorbis-1.0-ds/i686-debian-linux3.0/include")
+
+MESSAGE(STATUS "OggVorbis was found. Libdir ${OGGVORBIS_LIBRARY_DIR} Includedir ${OGGVORBIS_INCLUDE_DIR}")
Index: code/branches/FICN/cmake/FindOpenAL.cmake
===================================================================
--- code/branches/FICN/cmake/FindOpenAL.cmake	(revision 389)
+++ code/branches/FICN/cmake/FindOpenAL.cmake	(revision 389)
@@ -0,0 +1,88 @@
+# - Locate OpenAL
+# This module defines
+#  OPENAL_LIBRARY
+#  OPENAL_FOUND, if false, do not try to link to OpenAL
+#  OPENAL_INCLUDE_DIR, where to find the headers
+#
+# $OPENALDIR is an environment variable that would
+# correspond to the ./configure --prefix=$OPENALDIR
+# used in building OpenAL.
+#
+
+# Created by Eric Wing. This was influenced by the FindSDL.cmake module.
+# On OSX, this will prefer the Framework version (if found) over others.
+# People will have to manually change the cache values of
+# OPENAL_LIBRARY to override this selection.
+# Tiger will include OpenAL as part of the System.
+# But for now, we have to look around.
+# Other (Unix) systems should be able to utilize the non-framework paths.
+FIND_PATH(OPENAL_INCLUDE_DIR AL/al.h
+  $ENV{OPENALDIR}/include
+  ~/Library/Frameworks/OpenAL.framework/Headers
+  /Library/Frameworks/OpenAL.framework/Headers
+  /System/Library/Frameworks/OpenAL.framework/Headers # Tiger
+  /usr/pack/openal-0.0.8-cl/include # Tardis specific hack
+  /usr/local/include/
+  /usr/local/include/OpenAL
+  /usr/local/include
+  /usr/include/
+  /usr/include/OpenAL
+  /usr/include
+  /sw/include # Fink
+  /sw/include/OpenAL
+  /sw/include
+  /opt/local/include # DarwinPorts
+  /opt/local/include/OpenAL
+  /opt/local/include
+  /opt/csw/include # Blastwave
+  /opt/csw/include/OpenAL
+  /opt/csw/include
+  /opt/include
+  /opt/include/OpenAL
+  /opt/include
+  )
+# I'm not sure if I should do a special casing for Apple. It is
+# unlikely that other Unix systems will find the framework path.
+# But if they do ([Next|Open|GNU]Step?),
+# do they want the -framework option also?
+IF(${OPENAL_INCLUDE_DIR} MATCHES ".framework")
+  STRING(REGEX REPLACE "(.*)/.*\\.framework/.*" "\\1" OPENAL_FRAMEWORK_PATH_TMP ${OPENAL_INCLUDE_DIR})
+  IF("${OPENAL_FRAMEWORK_PATH_TMP}" STREQUAL "/Library/Frameworks"
+      OR "${OPENAL_FRAMEWORK_PATH_TMP}" STREQUAL "/System/Library/Frameworks"
+      )
+    # String is in default search path, don't need to use -F
+    SET (OPENAL_LIBRARY "-framework OpenAL" CACHE STRING "OpenAL framework for OSX")
+  ELSE("${OPENAL_FRAMEWORK_PATH_TMP}" STREQUAL "/Library/Frameworks"
+      OR "${OPENAL_FRAMEWORK_PATH_TMP}" STREQUAL "/System/Library/Frameworks"
+      )
+    # String is not /Library/Frameworks, need to use -F
+    SET(OPENAL_LIBRARY "-F${OPENAL_FRAMEWORK_PATH_TMP} -framework OpenAL" CACHE STRING "OpenAL framework for OSX")
+  ENDIF("${OPENAL_FRAMEWORK_PATH_TMP}" STREQUAL "/Library/Frameworks"
+    OR "${OPENAL_FRAMEWORK_PATH_TMP}" STREQUAL "/System/Library/Frameworks"
+    )
+  # Clear the temp variable so nobody can see it
+  SET(OPENAL_FRAMEWORK_PATH_TMP "" CACHE INTERNAL "")
+
+ELSE(${OPENAL_INCLUDE_DIR} MATCHES ".framework")
+  FIND_LIBRARY(OPENAL_LIBRARY
+    NAMES openal al OpenAL32
+    PATHS
+    $ENV{OPENALDIR}/lib
+    $ENV{OPENALDIR}/libs
+		/usr/pack/openal-0.0.8-cl/i686-debian-linux3.1/lib
+    /usr/local/lib
+    /usr/lib
+    /sw/lib
+    /opt/local/lib
+    /opt/csw/lib
+    /opt/lib
+    )
+ENDIF(${OPENAL_INCLUDE_DIR} MATCHES ".framework")
+
+SET(OPENAL_FOUND "NO")
+IF(OPENAL_LIBRARY)
+  SET(OPENAL_FOUND "YES")
+	MESSAGE(STATUS "OpenAL was found. Libdir ${OPENAL_LIBRARY} Includedir ${OPENAL_INCLUDE_DIR}")
+ENDIF(OPENAL_LIBRARY)
+
+
Index: code/branches/FICN/cmakeclearcache
===================================================================
--- code/branches/FICN/cmakeclearcache	(revision 389)
+++ code/branches/FICN/cmakeclearcache	(revision 389)
@@ -0,0 +1,10 @@
+#!/bin/bash
+# Clears the cmake cache
+# Author: Nicolas Perrenoud <nicolape@ee.ethz.ch>
+
+find . -iname "cmakecache*" -exec rm -f {} \;
+find . -iname "cmake_ins*" -exec rm -f {} \;
+find . -iname "cmakefiles*" -exec rm -fr {} \;
+find . -iname "Makefile*" -exec rm -fr {} \;
+
+echo "Cmake Cache cleared!"
Index: code/branches/FICN/src/CMakeLists.txt
===================================================================
--- code/branches/FICN/src/CMakeLists.txt	(revision 386)
+++ code/branches/FICN/src/CMakeLists.txt	(revision 389)
@@ -6,4 +6,6 @@
 ADD_SUBDIRECTORY(network)
 ADD_SUBDIRECTORY(orxonox)
+ADD_SUBDIRECTORY(class_hierarchy)
+ADD_SUBDIRECTORY(audio)
 
-# xml get handled by loader
+# xml gets handled by loader
Index: code/branches/FICN/src/audio/AudioBuffer.cc
===================================================================
--- code/branches/FICN/src/audio/AudioBuffer.cc	(revision 389)
+++ code/branches/FICN/src/audio/AudioBuffer.cc	(revision 389)
@@ -0,0 +1,28 @@
+#include "AudioBuffer.h"
+
+namespace audio
+{
+	AudioBuffer::AudioBuffer(std::string fileName)
+	{
+		// Load wav data into buffers.
+		alGenBuffers(1, &buffer);
+
+		if(alGetError() != AL_NO_ERROR)
+			loaded=AL_FALSE;
+
+		alutLoadWAVFile((ALbyte*)fileName.c_str(), &format, &data, &size, &freq, &loop);
+		alBufferData(buffer, format, data, size, freq);
+		alutUnloadWAV(format, data, size, freq);
+
+		// Do another error check and return.
+		if(alGetError() != AL_NO_ERROR)
+			loaded=AL_FALSE;
+	
+		loaded=AL_TRUE;
+	}
+	
+	AudioBuffer::~AudioBuffer()
+	{
+		
+	}
+}
Index: code/branches/FICN/src/audio/AudioBuffer.h
===================================================================
--- code/branches/FICN/src/audio/AudioBuffer.h	(revision 389)
+++ code/branches/FICN/src/audio/AudioBuffer.h	(revision 389)
@@ -0,0 +1,35 @@
+#ifndef AUDIOBUFFER_H_
+#define AUDIOBUFFER_H_
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include <AL/al.h>
+#include <AL/alc.h>
+#include <AL/alut.h>
+
+namespace audio
+{
+	class AudioBuffer
+	{
+	public:
+		AudioBuffer(std::string fileName);
+		~AudioBuffer();
+	private:
+		// Buffers hold sound data.
+		ALuint buffer;
+		// Identifier
+		std::string name;
+		// True if AL was able to load data
+		ALboolean loaded;
+		
+		ALenum format;
+		ALsizei size;
+		ALvoid* data;
+		ALsizei freq;
+		ALboolean loop;
+	};
+}
+
+#endif /*AUDIOBUFFER_H_*/
Index: code/branches/FICN/src/audio/AudioManager.cc
===================================================================
--- code/branches/FICN/src/audio/AudioManager.cc	(revision 389)
+++ code/branches/FICN/src/audio/AudioManager.cc	(revision 389)
@@ -0,0 +1,29 @@
+#include "AudioManager.h"
+
+namespace audio
+{
+	AudioManager::AudioManager()
+	{
+		
+	}
+		
+	AudioManager::~AudioManager()
+	{
+		
+	}
+	
+	void AudioManager::setPos(std::vector<float> newPosition)
+	{
+		
+	}
+
+	void AudioManager::setSpeed(std::vector<float> newSpeed)
+	{
+		
+	}
+
+	void AudioManager::setOri(std::vector<float> at, std::vector<float> up)
+	{
+		
+	}
+}
Index: code/branches/FICN/src/audio/AudioManager.h
===================================================================
--- code/branches/FICN/src/audio/AudioManager.h	(revision 389)
+++ code/branches/FICN/src/audio/AudioManager.h	(revision 389)
@@ -0,0 +1,51 @@
+#ifndef AUDIOMANAGER_H_
+#define AUDIOMANAGER_H_
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include <AL/al.h>
+#include <AL/alc.h>
+#include <AL/alut.h>
+
+#include "AudioBuffer.h"
+#include "AudioSource.h"
+
+namespace audio
+{
+	class AudioManager
+	{
+	public:
+		// Init audio 
+		AudioManager();
+		// Kill audio and set buffers, sources and memory free
+		~AudioManager();
+		// Set listener position
+		void setPos(std::vector<float> newPosition);
+		// Set listener speed
+		void setSpeed(std::vector<float> newSpeed);
+		// Set listener orientation (first is direction
+		// the listener looks at, the second is the direction
+		// upwards the listener)
+		void setOri(std::vector<float> at, std::vector<float> up);
+		// Parses given xml string
+		void loadParams();
+	private:
+
+	
+		// Vector containing all audio files
+		std::vector<AudioBuffer> buffers;
+		// Vector containing all audio sources which referer to one buffer
+		std::vector<AudioSource> sources;
+		// The ambient background sound 	
+		AudioSource ambient;
+		
+		std::vector<float> listenerPosition;
+		std::vector<float> listenerSpeed;
+		std::vector<float> listenerAt;
+		std::vector<float> listenerup;		
+	};	
+}
+
+#endif /*AUDIOMANAGER_H_*/
Index: code/branches/FICN/src/audio/AudioSource.cc
===================================================================
--- code/branches/FICN/src/audio/AudioSource.cc	(revision 389)
+++ code/branches/FICN/src/audio/AudioSource.cc	(revision 389)
@@ -0,0 +1,14 @@
+#include "AudioSource.h"
+
+namespace audio
+{
+	AudioSource::AudioSource()
+	{
+
+	}
+	
+	AudioSource::~AudioSource()
+	{
+		
+	}
+}
Index: code/branches/FICN/src/audio/AudioSource.h
===================================================================
--- code/branches/FICN/src/audio/AudioSource.h	(revision 389)
+++ code/branches/FICN/src/audio/AudioSource.h	(revision 389)
@@ -0,0 +1,24 @@
+#ifndef AUDIOSOURCE_H_
+#define AUDIOSOURCE_H_
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include <AL/al.h>
+#include <AL/alc.h>
+#include <AL/alut.h>
+
+namespace audio
+{
+	class AudioSource
+	{
+	public:
+		AudioSource();
+		~AudioSource();
+	private:
+
+	};
+}
+
+#endif /*AUDIOSOURCE_H_*/
Index: code/branches/FICN/src/audio/CMakeLists.txt
===================================================================
--- code/branches/FICN/src/audio/CMakeLists.txt	(revision 389)
+++ code/branches/FICN/src/audio/CMakeLists.txt	(revision 389)
@@ -0,0 +1,19 @@
+PROJECT(Orxonox)
+
+SET(SRC_FILES 
+	AudioManager.cc
+	AudioBuffer.cc
+	AudioSource.cc
+)
+SET(INC_FILES 
+	AudioManager.h
+	AudioBuffer.h
+	AudioSource.h
+)
+
+
+ADD_LIBRARY(audio ${SRC_FILES} ${INC_FILES})
+
+TARGET_LINK_LIBRARIES(audio ${OPENAL_LIBRARY} ${ALUT_LIBRARY} ${OGGVORBIS_LIBRARY})
+
+
Index: code/branches/FICN/src/audio/_Ambient.cc
===================================================================
--- code/branches/FICN/src/audio/_Ambient.cc	(revision 389)
+++ code/branches/FICN/src/audio/_Ambient.cc	(revision 389)
@@ -0,0 +1,22 @@
+#include <iostream>
+#include <string>
+#include "Ambient.h"
+
+namespace audio
+{
+	Ambient::Ambient(std::string audioFile)
+	{
+		a = new AudioObject(audioFile);
+	}
+	
+	Ambient::~Ambient()
+	{	
+		
+	}
+	
+	void Ambient::play()
+	{
+		a->play();	
+	}
+}
+
Index: code/branches/FICN/src/audio/_Ambient.h
===================================================================
--- code/branches/FICN/src/audio/_Ambient.h	(revision 389)
+++ code/branches/FICN/src/audio/_Ambient.h	(revision 389)
@@ -0,0 +1,24 @@
+#ifndef __CLASS_AMBIENT_H__
+#define __CLASS_AMBIENT_H__
+
+#include <iostream>
+#include "../../include/AL/al.h"
+#include "../../include/AL/alc.h"
+#include "../../include/AL/alut.h"
+
+#include "AudioObject.h"
+
+namespace audio
+{
+	class Ambient
+	{
+	public:
+		Ambient(std::string audioFile);
+		~Ambient();
+		void play();
+	private:
+		AudioObject* a;
+	};
+}
+
+#endif
Index: code/branches/FICN/src/audio/_AudioObject.cc
===================================================================
--- code/branches/FICN/src/audio/_AudioObject.cc	(revision 389)
+++ code/branches/FICN/src/audio/_AudioObject.cc	(revision 389)
@@ -0,0 +1,113 @@
+#include <iostream>
+#include <string>
+#include "AudioObject.h"
+
+namespace audio
+{
+	AudioObject::AudioObject(std::string audioFile)
+	{
+		audioFile_ = audioFile;
+		SourcePos[0]=0;
+		SourcePos[1]=0;
+		SourcePos[2]=0;
+
+		 SourceVel[0]=0;
+		 SourceVel[1]=0;
+		 SourceVel[2]=0;
+
+		 ListenerPos[0]=0;
+		 ListenerPos[1]=0;
+		 ListenerPos[2]=0;
+
+		 ListenerVel[0]=0;
+		 ListenerVel[1]=0;
+		 ListenerVel[2]=0;
+
+		 ListenerOri[0]=0;
+		 ListenerOri[1]=0;
+		 ListenerOri[2]=-1;
+		 ListenerOri[3]=0;
+		 ListenerOri[4]=1;
+		 ListenerOri[5]=0;
+
+
+		// Initialize OpenAL and clear the error bit.
+	
+		alutInit(NULL, 0);
+		alGetError();
+	
+		// Load the wav data.
+	
+		if(LoadALData() == AL_FALSE)
+		{
+		    printf("Error loading sound data.");
+			
+		}
+
+		SetListenerValues();
+		std::cout << "Play sone ambient background sound";
+	}
+	
+	AudioObject::~AudioObject()
+	{	
+		KillALData();
+	}
+	
+	ALboolean AudioObject::LoadALData()
+	{
+		ALenum format;
+		ALsizei size;
+		ALvoid* data;
+		ALsizei freq;
+		ALboolean loop;
+	
+	
+		alGenBuffers(1, &Buffer);
+	
+		if(alGetError() != AL_NO_ERROR)
+			return AL_FALSE;
+	
+		alutLoadWAVFile((ALbyte*)audioFile_.c_str(), &format, &data, &size, &freq, &loop);
+		alBufferData(Buffer, format, data, size, freq);
+		alutUnloadWAV(format, data, size, freq);
+	
+		alGenSources(1, &Source);
+	
+		if(alGetError() != AL_NO_ERROR)
+			return AL_FALSE;
+	
+		alSourcei (Source, AL_BUFFER,   Buffer   );
+		alSourcef (Source, AL_PITCH,    1.0      );
+		alSourcef (Source, AL_GAIN,     1.0      );
+		alSourcefv(Source, AL_POSITION, SourcePos);
+		alSourcefv(Source, AL_VELOCITY, SourceVel);
+		alSourcei (Source, AL_LOOPING,  loop     );
+	
+		if(alGetError() == AL_NO_ERROR)
+			return AL_TRUE;
+	
+	
+		return AL_FALSE;
+	}	
+
+	void AudioObject::SetListenerValues()
+	{
+		alListenerfv(AL_POSITION,    ListenerPos);
+		alListenerfv(AL_VELOCITY,    ListenerVel);
+		alListenerfv(AL_ORIENTATION, ListenerOri);
+	}
+	
+	void AudioObject::KillALData()
+	{
+		alDeleteBuffers(1, &Buffer);
+		alDeleteSources(1, &Source);
+		alutExit();
+	}
+
+	void AudioObject::play()
+	{
+		alSourcePlay(Source);
+	
+	}
+}
+
Index: code/branches/FICN/src/audio/_AudioObject.h
===================================================================
--- code/branches/FICN/src/audio/_AudioObject.h	(revision 389)
+++ code/branches/FICN/src/audio/_AudioObject.h	(revision 389)
@@ -0,0 +1,38 @@
+#ifndef AUDIOOBJECT_H_
+#define AUDIOOBJECT_H_
+
+#include <iostream>
+#include "../../include/AL/al.h"
+#include "../../include/AL/alc.h"
+#include "../../include/AL/alut.h"
+
+namespace audio
+{
+	class AudioObject
+	{
+	public:
+		AudioObject(std::string audioFile);
+		~AudioObject();
+
+		void play();
+		void pause();
+		void stop();
+
+	private:
+		ALboolean LoadALData();	
+		void SetListenerValues();
+		void KillALData();
+		
+		std::string audioFile_;
+		
+		ALuint Buffer;
+		ALuint Source;
+		ALfloat SourcePos[3];
+		ALfloat SourceVel[3];
+		ALfloat ListenerPos[3];
+		ALfloat ListenerVel[3];
+		ALfloat ListenerOri[6];
+	};	
+}
+
+#endif /*AUDIOOBJECT_H_*/
Index: code/branches/FICN/src/class_hierarchy/BaseObject.cc
===================================================================
--- code/branches/FICN/src/class_hierarchy/BaseObject.cc	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/BaseObject.cc	(revision 389)
@@ -0,0 +1,14 @@
+#include "BaseObject.h"
+
+namespace orxonox
+{
+    BaseObject::BaseObject()
+    {
+        registerRootObject(BaseObject);
+    }
+
+    BaseObject::~BaseObject()
+    {
+        unregisterObject();
+    }
+}
Index: code/branches/FICN/src/class_hierarchy/BaseObject.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/BaseObject.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/BaseObject.h	(revision 389)
@@ -0,0 +1,70 @@
+#ifndef _BaseObject_H__
+#define _BaseObject_H__
+
+#include "IdentifierIncludes.h"
+
+namespace orxonox
+{
+    class BaseObject : virtual public OrxonoxClass
+    {
+        public:
+            BaseObject();
+            virtual ~BaseObject();
+
+            inline bool isA(Identifier* identifier)
+                { return this->getIdentifier()->isA(identifier); }
+            inline bool isDirectlyA(Identifier* identifier)
+                { return this->getIdentifier()->isDirectlyA(identifier); }
+            inline bool isChildOf(Identifier* identifier)
+                { return this->getIdentifier()->isChildOf(identifier); }
+            inline bool isDirectChildOf(Identifier* identifier)
+                { return this->getIdentifier()->isDirectChildOf(identifier); }
+            inline bool isParentOf(Identifier* identifier)
+                { return this->getIdentifier()->isParentOf(identifier); }
+            inline bool isDirectParentOf(Identifier* identifier)
+                { return this->getIdentifier()->isDirectParentOf(identifier); }
+
+            inline bool isA(BaseIdentifier<class B>* identifier)
+                { return this->getIdentifier()->isA(identifier->getIdentifier()); }
+            inline bool isDirectlyA(BaseIdentifier<class B>* identifier)
+                { return this->getIdentifier()->isDirectlyA(identifier->getIdentifier()); }
+            inline bool isChildOf(BaseIdentifier<class B>* identifier)
+                { return this->getIdentifier()->isChildOf(identifier->getIdentifier()); }
+            inline bool isDirectChildOf(BaseIdentifier<class B>* identifier)
+                { return this->getIdentifier()->isDirectChildOf(identifier->getIdentifier()); }
+            inline bool isParentOf(BaseIdentifier<class B>* identifier)
+                { return this->getIdentifier()->isParentOf(identifier->getIdentifier()); }
+            inline bool isDirectParentOf(BaseIdentifier<class B>* identifier)
+                { return this->getIdentifier()->isDirectParentOf(identifier->getIdentifier()); }
+
+            inline bool isA(BaseIdentifier<class B> identifier)
+                { return this->getIdentifier()->isA(identifier.getIdentifier()); }
+            inline bool isDirectlyA(BaseIdentifier<class B> identifier)
+                { return this->getIdentifier()->isDirectlyA(identifier.getIdentifier()); }
+            inline bool isChildOf(BaseIdentifier<class B> identifier)
+                { return this->getIdentifier()->isChildOf(identifier.getIdentifier()); }
+            inline bool isDirectChildOf(BaseIdentifier<class B> identifier)
+                { return this->getIdentifier()->isDirectChildOf(identifier.getIdentifier()); }
+            inline bool isParentOf(BaseIdentifier<class B> identifier)
+                { return this->getIdentifier()->isParentOf(identifier.getIdentifier()); }
+            inline bool isDirectParentOf(BaseIdentifier<class B> identifier)
+                { return this->getIdentifier()->isDirectParentOf(identifier.getIdentifier()); }
+/*
+            inline bool isA(OrxonoxClass* object)
+                { return this->getIdentifier()->isA(object->getIdentifier()); }
+            inline bool isDirectlyA(OrxonoxClass* object)
+                { return this->getIdentifier()->isDirectlyA(object->getIdentifier); }
+            inline bool isChildOf(OrxonoxClass* object)
+                { return this->getIdentifier()->isChildOf(object->getIdentifier); }
+            inline bool isDirectChildOf(OrxonoxClass* object)
+                { return this->getIdentifier()->isDirectChildOf(object->getIdentifier); }
+            inline bool isParentOf(OrxonoxClass* object)
+                { return this->getIdentifier()->isParentOf(object->getIdentifier); }
+            inline bool isDirectParentOf(OrxonoxClass* object)
+                { return this->getIdentifier()->isDirectParentOf(object->getIdentifier); }
+*/
+
+    };
+}
+
+#endif
Index: code/branches/FICN/src/class_hierarchy/CMakeLists.txt
===================================================================
--- code/branches/FICN/src/class_hierarchy/CMakeLists.txt	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/CMakeLists.txt	(revision 389)
@@ -0,0 +1,17 @@
+PROJECT(Orxonox)
+
+# create a few variables to simplify life
+SET( CLASS_HIERARCHY_SRC
+	BaseObject.cc
+	ClassHierarchy.cc
+	Identifier.cc
+	IdentifierList.cc
+	ObjectList.cc
+	orxonox.cc
+	OrxonoxClass.cc
+	test1.cc
+	test2.cc
+	test3.cc
+   )
+
+ADD_LIBRARY(classHierarchy ${CLASS_HIERARCHY_SRC} )
Index: code/branches/FICN/src/class_hierarchy/ClassHierarchy.cc
===================================================================
--- code/branches/FICN/src/class_hierarchy/ClassHierarchy.cc	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/ClassHierarchy.cc	(revision 389)
@@ -0,0 +1,28 @@
+#include "ClassHierarchy.h"
+#include "OrxonoxClass.h"
+
+namespace orxonox
+{
+    // ###############################
+    // ###     ClassHierarchy      ###
+    // ###############################
+    ClassHierarchy* ClassHierarchy::pointer_ = NULL;
+
+    ClassHierarchy* ClassHierarchy::getSingleton()
+    {
+        if (!pointer_)
+            pointer_ = new ClassHierarchy();
+
+        return pointer_;
+    }
+
+    ClassHierarchy::ClassHierarchy()
+    {
+        this->hierarchyCreatingCounter_ = 0;
+    }
+
+    ClassHierarchy::~ClassHierarchy()
+    {
+      this->pointer_ = NULL;
+    }
+}
Index: code/branches/FICN/src/class_hierarchy/ClassHierarchy.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/ClassHierarchy.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/ClassHierarchy.h	(revision 389)
@@ -0,0 +1,97 @@
+#ifndef _ClassHierarchy_H__
+#define _ClassHierarchy_H__
+
+#include <string>
+#include <iostream>
+
+// DONE AND TESTED:
+// - build class hierarchy
+// - isA, isChildOf, ...
+// - insert into class-lists
+// - ClassIdentifier
+// - BaseIdentifier
+
+// IN WORK:
+// - Factory
+
+// TO DO:
+// - iterate through lists
+// - searchtree for classname-strings
+
+
+namespace orxonox
+{
+    // ##### ClassHierarchy #####
+    template <class T>
+    class ClassIdentifier;
+
+    class ClassHierarchy
+    {
+        template <class T>
+        friend class ClassIdentifier;
+
+        public:
+            static ClassHierarchy* getSingleton();
+            bool isCreatingHierarchy() { return (this->hierarchyCreatingCounter_ > 0); }
+
+        private:
+            ClassHierarchy();
+            ~ClassHierarchy();
+            void startCreatingHierarchy() { this->hierarchyCreatingCounter_++; std::cout << "*** Increased Hierarchy-Creating-Counter to " << this->hierarchyCreatingCounter_ << "\n"; }
+            void stopCreatingHierarchy() { this->hierarchyCreatingCounter_--; std::cout << "*** Decreased Hierarchy-Creating-Counter to " << this->hierarchyCreatingCounter_ << "\n"; }
+
+            static ClassHierarchy* pointer_;
+            int hierarchyCreatingCounter_;
+    };
+
+
+    // ##### Macros #####
+    #define registerRootObject(ClassName) \
+        std::cout << "*** Register Root-Object: " << #ClassName << "\n"; \
+        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && !this->getParents()) \
+            this->setParents(new IdentifierList()); \
+        if (this->getIdentifier()) \
+            this->getIdentifier()->removeObject(this); \
+        this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, true, false)); \
+        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \
+            this->getParents()->add(this->getIdentifier()); \
+        this->getIdentifier()->addObject(this)
+
+    #define registerAbstractRootObject(ClassName) \
+        std::cout << "*** Register Root-Object: " << #ClassName << "\n"; \
+        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && !this->getParents()) \
+            this->setParents(new IdentifierList()); \
+        if (this->getIdentifier()) \
+            this->getIdentifier()->removeObject(this); \
+        this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, true, true)); \
+        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \
+            this->getParents()->add(this->getIdentifier()); \
+        this->getIdentifier()->addObject(this)
+
+    #define registerObject(ClassName) \
+        std::cout << "*** Register Object: " << #ClassName << "\n"; \
+        this->getIdentifier()->removeObject(this); \
+        this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, false, false)); \
+        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \
+            this->getParents()->add(this->getIdentifier()); \
+        this->getIdentifier()->addObject(this)
+
+    #define registerAbstractObject(ClassName) \
+        std::cout << "*** Register Object: " << #ClassName << "\n"; \
+        this->getIdentifier()->removeObject(this); \
+        this->setIdentifier(ClassIdentifier<ClassName>::registerClass(this->getParents(), #ClassName, false, true)); \
+        if (ClassHierarchy::getSingleton()->isCreatingHierarchy() && this->getParents()) \
+            this->getParents()->add(this->getIdentifier()); \
+        this->getIdentifier()->addObject(this)
+
+    #define unregisterObject() \
+        this->getIdentifier()->removeObject(this)
+
+    #define Class(ClassName) \
+        ClassIdentifier<ClassName>::getIdentifier()
+
+    #define Factory(ClassName) \
+        ClassIdentifier<ClassName>::create()
+}
+
+#endif
Index: code/branches/FICN/src/class_hierarchy/Identifier.cc
===================================================================
--- code/branches/FICN/src/class_hierarchy/Identifier.cc	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/Identifier.cc	(revision 389)
@@ -0,0 +1,117 @@
+#include "Identifier.h"
+
+namespace orxonox
+{
+    // ###############################
+    // ###       Identifier        ###
+    // ###############################
+    Identifier::Identifier()
+    {
+        this->bCreatedOneObject_ = false;
+        this->directParents_ = new IdentifierList();
+        this->allParents_ = new IdentifierList();
+        this->directChildren_ = new IdentifierList();
+        this->allChildren_ = new IdentifierList();
+        this->objects_ = new ObjectList();
+    }
+
+    Identifier::~Identifier()
+    {
+        delete this->directParents_;
+        delete this->allParents_;
+        delete this->directChildren_;
+        delete this->allChildren_;
+        delete this->objects_;
+        delete &this->name_;
+    }
+
+    void Identifier::initialize(IdentifierList* parents)
+    {
+        std::cout << "*** Initialize " << this->name_ << "-Singleton.\n";
+        if (parents)
+        {
+            this->bCreatedOneObject_ = true;
+
+            IdentifierListElement* temp1;
+            IdentifierListElement* temp2;
+            IdentifierListElement* temp3;
+
+            temp1 = parents->first_;
+            while (temp1)
+            {
+                temp2 = temp1->identifier_->directParents_->first_;
+                while (temp2)
+                {
+                    temp3 = parents->first_;
+                    while(temp3)
+                    {
+                        if (temp3->identifier_ == temp2->identifier_)
+                            temp3->bDirect_ = false;
+
+                        temp3 = temp3->next_;
+                    }
+
+                    temp2 = temp2->next_;
+                }
+                temp1 = temp1->next_;
+            }
+
+            temp1 = parents->first_;
+            while (temp1)
+            {
+                if (temp1->bDirect_)
+                {
+                    this->directParents_->add(temp1->identifier_);
+                    temp1->identifier_->directChildren_->add(this);
+                }
+
+                this->allParents_->add(temp1->identifier_);
+                temp1->identifier_->allChildren_->add(this);
+
+                temp1 = temp1->next_;
+            }
+        }
+    }
+
+    void Identifier::addObject(OrxonoxClass* object)
+    {
+        std::cout << "*** Added " << this->name_ << " to list.\n";
+        this->objects_->add(object);
+    }
+
+    void Identifier::removeObject(OrxonoxClass* object)
+    {
+        std::cout << "*** Removed " << this->name_ << " from list.\n";
+        this->objects_->remove(object);
+    }
+
+    bool Identifier::isA(Identifier* identifier)
+    {
+        return (identifier == this || this->allParents_->isInList(identifier));
+    }
+
+    bool Identifier::isDirectlyA(Identifier* identifier)
+    {
+        return (identifier == this);
+    }
+
+    bool Identifier::isChildOf(Identifier* identifier)
+    {
+        return this->allParents_->isInList(identifier);
+    }
+
+    bool Identifier::isDirectChildOf(Identifier* identifier)
+    {
+        return this->directParents_->isInList(identifier);
+    }
+
+    bool Identifier::isParentOf(Identifier* identifier)
+    {
+        return this->allChildren_->isInList(identifier);
+    }
+
+    bool Identifier::isDirectParentOf(Identifier* identifier)
+    {
+        return this->directChildren_->isInList(identifier);
+    }
+}
Index: code/branches/FICN/src/class_hierarchy/Identifier.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/Identifier.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/Identifier.h	(revision 389)
@@ -0,0 +1,173 @@
+#ifndef _Identifier_H__
+#define _Identifier_H__
+
+#include "ClassHierarchy.h"
+#include "IdentifierList.h"
+#include "ObjectList.h"
+#include "OrxonoxClass.h"
+
+namespace orxonox
+{
+    // ##### Identifier #####
+    class Identifier
+    {
+        template <class T>
+        friend class ClassIdentifier;
+
+        template <class T>
+        friend class BaseIdentifier;
+
+        public:
+            void addObject(OrxonoxClass* object);
+            void removeObject(OrxonoxClass* object);
+
+            bool isA(Identifier* identifier);
+            bool isDirectlyA(Identifier* identifier);
+            bool isChildOf(Identifier* identifier);
+            bool isDirectChildOf(Identifier* identifier);
+            bool isParentOf(Identifier* identifier);
+            bool isDirectParentOf(Identifier* identifier);
+
+            std::string getName() { return this->name_; }
+            IdentifierList* getDirectParents() { return this->directParents_; }
+            IdentifierList* getAllParents() { return this->allParents_; }
+            IdentifierList* getDirectChildren() { return this->directChildren_; }
+            IdentifierList* getAllChildren() { return this->allChildren_; }
+
+        private:
+            Identifier();
+            Identifier(const Identifier& identifier) {}
+            virtual ~Identifier();
+            void initialize(IdentifierList* parents);
+
+            IdentifierList* directParents_;
+            IdentifierList* allParents_;
+            IdentifierList* directChildren_;
+            IdentifierList* allChildren_;
+
+            ObjectList* objects_;
+            std::string name_;
+
+            bool bIsAbstractClass_;
+            bool bCreatedOneObject_;
+    };
+
+
+    // ##### ClassIdentifier #####
+    template <class T>
+    class ClassIdentifier : public Identifier
+    {
+        public:
+            static ClassIdentifier<T>* registerClass(IdentifierList* parents, std::string name, bool bRootClass, bool bIsAbstractClass);
+            static ClassIdentifier<T>* getIdentifier();
+
+        private:
+            ClassIdentifier();
+            ClassIdentifier(const ClassIdentifier<T>& identifier) {}
+            ~ClassIdentifier();
+
+            static ClassIdentifier<T>* pointer_;
+
+    };
+
+    template <class T>
+    ClassIdentifier<T>* ClassIdentifier<T>::pointer_ = NULL;
+
+    template <class T>
+    ClassIdentifier<T>::ClassIdentifier()
+    {
+    }
+
+    template <class T>
+    ClassIdentifier<T>::~ClassIdentifier()
+    {
+        this->pointer_ = NULL;
+    }
+
+    template <class T>
+    ClassIdentifier<T>* ClassIdentifier<T>::registerClass(IdentifierList* parents, std::string name, bool bRootClass, bool bIsAbstractClass)
+    {
+        std::cout << "*** Register Class in " << name << "-Singleton.\n";
+        if (!pointer_)
+        {
+            std::cout << "*** Register Class in " << name << "-Singleton -> Create Singleton.\n";
+            if (parents || bRootClass)
+            {
+                pointer_ = new ClassIdentifier();
+                pointer_->name_ = name;
+                pointer_->bIsAbstractClass_ = bIsAbstractClass;
+                pointer_->initialize(parents);
+            }
+            else
+            {
+                pointer_ = getIdentifier();
+            }
+        }
+
+        return pointer_;
+    }
+
+    template <class T>
+    ClassIdentifier<T>* ClassIdentifier<T>::getIdentifier()
+    {
+//        std::cout << "*** Get Identifier.\n";
+        if (!pointer_)
+        {
+            std::cout << "*** Get Identifier -> Create Class\n";
+            ClassHierarchy::getSingleton()->startCreatingHierarchy();
+            T* temp = new T();
+            ClassHierarchy::getSingleton()->stopCreatingHierarchy();
+            delete temp;
+        }
+
+        return pointer_;
+    }
+
+
+    // ##### BaseIdentifier #####
+    template <class B>
+    class BaseIdentifier// : public Identifier
+    {
+        public:
+            BaseIdentifier();
+
+            //template <class T>
+            BaseIdentifier<B>& operator= (/*Class*/Identifier/*<T>*/* identifier)
+            {
+                if (!identifier->isA(ClassIdentifier<B>::getIdentifier()))
+                {
+                    std::cout << "Error: Class " << identifier->getName() << " is not a " << ClassIdentifier<B>::getIdentifier()->getName() << "!\n";
+                    std::cout << "Error: BaseIdentifier<" << ClassIdentifier<B>::getIdentifier()->getName() << "> = Class(" << identifier->getName() << ") is forbidden.\n";
+                    std::cout << "Aborting...\n";
+                    abort();
+                }
+                this->identifier_ = identifier;
+                return *this;
+            }
+            inline Identifier* getIdentifier()
+                { return this->identifier_; }
+            inline bool isA(Identifier* identifier)
+                { return this->identifier_->isA(identifier); }
+            inline bool isDirectlyA(Identifier* identifier)
+                { return this->identifier_->isDirectlyA(identifier); }
+            inline bool isChildOf(Identifier* identifier)
+                { return this->identifier_->isChildOf(identifier); }
+            inline bool isDirectChildOf(Identifier* identifier)
+                { return this->identifier_->isDirectChildOf(identifier); }
+            inline bool isParentOf(Identifier* identifier)
+                { return this->identifier_->isParentOf(identifier); }
+            inline bool isDirectParentOf(Identifier* identifier)
+                { return this->identifier_->isDirectParentOf(identifier); }
+
+        private:
+            Identifier* identifier_;
+    };
+
+    template <class B>
+    BaseIdentifier<B>::BaseIdentifier()
+    {
+        this->identifier_ = ClassIdentifier<B>::getIdentifier();
+    }
+}
+
+#endif
Index: code/branches/FICN/src/class_hierarchy/IdentifierIncludes.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/IdentifierIncludes.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/IdentifierIncludes.h	(revision 389)
@@ -0,0 +1,5 @@
+#include "ClassHierarchy.h"
+#include "Identifier.h"
+#include "IdentifierList.h"
+#include "ObjectList.h"
+#include "OrxonoxClass.h"
Index: code/branches/FICN/src/class_hierarchy/IdentifierList.cc
===================================================================
--- code/branches/FICN/src/class_hierarchy/IdentifierList.cc	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/IdentifierList.cc	(revision 389)
@@ -0,0 +1,106 @@
+#include "IdentifierList.h"
+#include "Identifier.h"
+
+namespace orxonox
+{
+    // ###############################
+    // ###     IdentifierList      ###
+    // ###############################
+    IdentifierList::IdentifierList()
+    {
+        this->first_ = 0;
+    }
+
+    IdentifierList::~IdentifierList()
+    {
+        IdentifierListElement* temp;
+        while (this->first_)
+        {
+            temp = this->first_->next_;
+            delete this->first_;
+            this->first_ = temp;
+        }
+    }
+
+    void IdentifierList::add(Identifier* identifier)
+    {
+        IdentifierListElement* temp = this->first_;
+        this->first_ = new IdentifierListElement(identifier);
+        this->first_->next_ = temp;
+    }
+
+    void IdentifierList::remove(Identifier* identifier)
+    {
+        if (!identifier)
+            return;
+
+        if (this->first_->identifier_ == identifier)
+        {
+            IdentifierListElement* temp = this->first_->next_;
+            delete this->first_;
+            this->first_ = temp;
+
+            return;
+        }
+
+        IdentifierListElement* temp = this->first_;
+        while (temp->next_)
+        {
+            if (temp->next_->identifier_ == identifier)
+            {
+                IdentifierListElement* temp2 = temp->next_->next_;
+                delete temp->next_;
+                temp->next_ = temp2;
+
+                return;
+            }
+
+            temp = temp->next_;
+        }
+    }
+
+    bool IdentifierList::isInList(Identifier* identifier)
+    {
+        IdentifierListElement* temp = this->first_;
+        while (temp)
+        {
+            if (temp->identifier_ == identifier)
+                return true;
+
+            temp = temp->next_;
+        }
+
+        return false;
+    }
+
+    std::string IdentifierList::toString()
+    {
+        IdentifierListElement* temp = this->first_;
+        std::string output = "";
+
+        while (temp)
+        {
+            output += temp->identifier_->getName();
+            output += " ";
+
+            temp = temp->next_;
+        }
+
+        return output;
+    }
+
+
+    // ###############################
+    // ###  IdentifierListElement  ###
+    // ###############################
+    IdentifierListElement::IdentifierListElement(Identifier* identifier)
+    {
+        this->identifier_ = identifier;
+        this->next_ = 0;
+        this->bDirect_ = true;
+    }
+
+    IdentifierListElement::~IdentifierListElement()
+    {
+    }
+}
Index: code/branches/FICN/src/class_hierarchy/IdentifierList.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/IdentifierList.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/IdentifierList.h	(revision 389)
@@ -0,0 +1,35 @@
+#ifndef _IdentifierList_H__
+#define _IdentifierList_H__
+
+#include <string>
+
+namespace orxonox
+{
+    class Identifier;
+
+    class IdentifierListElement
+    {
+        public:
+            IdentifierListElement(Identifier* identifier);
+            ~IdentifierListElement();
+
+            Identifier* identifier_;
+            IdentifierListElement* next_;
+            bool bDirect_;
+    };
+
+    class IdentifierList
+    {
+        public:
+            IdentifierList();
+            ~IdentifierList();
+            void add(Identifier* identifier);
+            void remove(Identifier* identifier);
+            bool isInList(Identifier* identifier);
+            std::string toString();
+
+            IdentifierListElement* first_;
+    };
+}
+
+#endif
Index: code/branches/FICN/src/class_hierarchy/ObjectList.cc
===================================================================
--- code/branches/FICN/src/class_hierarchy/ObjectList.cc	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/ObjectList.cc	(revision 389)
@@ -0,0 +1,74 @@
+#include "ObjectList.h"
+
+namespace orxonox
+{
+    // ###############################
+    // ###       ObjectList        ###
+    // ###############################
+    ObjectList::ObjectList()
+    {
+        this->first_ = 0;
+    }
+
+    ObjectList::~ObjectList()
+    {
+        ObjectListElement* temp;
+        while (this->first_)
+        {
+            temp = this->first_->next_;
+            delete this->first_;
+            this->first_ = temp;
+        }
+    }
+
+    void ObjectList::add(OrxonoxClass* object)
+    {
+        ObjectListElement* temp = this->first_;
+        this->first_ = new ObjectListElement(object);
+        this->first_->next_ = temp;
+    }
+
+    void ObjectList::remove(OrxonoxClass* object)
+    {
+        if (!object)
+            return;
+
+        if (this->first_->object_ == object)
+        {
+            ObjectListElement* temp = this->first_->next_;
+            delete this->first_;
+            this->first_ = temp;
+
+            return;
+        }
+
+        ObjectListElement* temp = this->first_;
+        while (temp->next_)
+        {
+            if (temp->next_->object_ == object)
+            {
+                ObjectListElement* temp2 = temp->next_->next_;
+                delete temp->next_;
+                temp->next_ = temp2;
+
+                return;
+            }
+
+            temp = temp->next_;
+        }
+    }
+
+
+    // ###############################
+    // ###    ObjectListElement    ###
+    // ###############################
+    ObjectListElement::ObjectListElement(OrxonoxClass* object)
+    {
+        this->object_ = object;
+        this->next_ = 0;
+    }
+
+    ObjectListElement::~ObjectListElement()
+    {
+    }
+}
Index: code/branches/FICN/src/class_hierarchy/ObjectList.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/ObjectList.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/ObjectList.h	(revision 389)
@@ -0,0 +1,30 @@
+#ifndef _ObjectList_H__
+#define _ObjectList_H__
+
+namespace orxonox
+{
+    class OrxonoxClass;
+
+    class ObjectListElement
+    {
+        public:
+            ObjectListElement(OrxonoxClass* object);
+            ~ObjectListElement();
+
+            OrxonoxClass* object_;
+            ObjectListElement* next_;
+    };
+
+    class ObjectList
+    {
+        public:
+            ObjectList();
+            ~ObjectList();
+            void add(OrxonoxClass* object);
+            void remove(OrxonoxClass* object);
+
+            ObjectListElement* first_;
+    };
+}
+
+#endif
Index: code/branches/FICN/src/class_hierarchy/OrxonoxClass.cc
===================================================================
--- code/branches/FICN/src/class_hierarchy/OrxonoxClass.cc	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/OrxonoxClass.cc	(revision 389)
@@ -0,0 +1,17 @@
+#include "ClassHierarchy.h"
+#include "OrxonoxClass.h"
+
+namespace orxonox
+{
+    OrxonoxClass::OrxonoxClass()
+    {
+        this->identifier_ = 0;
+        this->parents_ = 0;
+    }
+
+    OrxonoxClass::~OrxonoxClass()
+    {
+        if (this->parents_)
+            delete this->parents_;
+    }
+}
Index: code/branches/FICN/src/class_hierarchy/OrxonoxClass.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/OrxonoxClass.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/OrxonoxClass.h	(revision 389)
@@ -0,0 +1,25 @@
+#ifndef _OrxonoxClass_H__
+#define _OrxonoxClass_H__
+
+#include "IdentifierList.h"
+#include "Identifier.h"
+
+namespace orxonox
+{
+    class OrxonoxClass
+    {
+        public:
+            OrxonoxClass();
+            ~OrxonoxClass();
+            Identifier* getIdentifier() { return this->identifier_; }
+            void setIdentifier(Identifier* identifier) { this->identifier_ = identifier; }
+            IdentifierList* getParents() { return this->parents_; }
+            void setParents(IdentifierList* parents) { this->parents_ = parents; }
+
+        private:
+            Identifier* identifier_;
+            IdentifierList* parents_;
+    };
+}
+
+#endif
Index: code/branches/FICN/src/class_hierarchy/Test.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/Test.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/Test.h	(revision 389)
@@ -0,0 +1,129 @@
+#ifndef _Test_H__
+#define _Test_H__
+
+#include "IdentifierIncludes.h"
+
+namespace orxonox
+{
+    class Interface1 : virtual public OrxonoxClass
+    {
+        public:
+            Interface1() { registerRootObject(Interface1); }
+    };
+
+    class Interface2 : virtual public OrxonoxClass
+    {
+        public:
+            Interface2() { registerRootObject(Interface2); }
+    };
+
+    class A1 : public BaseObject
+    {
+        public:
+            A1() { registerObject(A1); }
+    };
+
+    class A2 : public BaseObject
+    {
+        public:
+            A2() { registerObject(A2); }
+    };
+
+    class A3: public BaseObject, public Interface1
+    {
+        public:
+            A3() { registerObject(A3); }
+    };
+
+    class A1B1 : public A1
+    {
+        public:
+            A1B1() { registerObject(A1B1); }
+    };
+
+    class A1B2 : public A1
+    {
+        public:
+            A1B2() { registerObject(A1B2); }
+    };
+
+    class A2B1 : public A2
+    {
+        public:
+            A2B1() { registerObject(A2B1); }
+    };
+
+    class A2B2 : public A2, Interface1
+    {
+        public:
+            A2B2() { registerObject(A2B2); }
+    };
+
+    class A3B1 : public A3
+    {
+        public:
+            A3B1() { registerObject(A3B1); }
+    };
+
+    class A3B2 : public A3, Interface2
+    {
+        public:
+            A3B2() { registerObject(A3B2); }
+    };
+
+    class A1B1C1 : public A1B1
+    {
+        public:
+            A1B1C1() { registerObject(A1B1C1); }
+    };
+
+    class A1B1C2 : public A1B1
+    {
+        public:
+            A1B1C2() { registerObject(A1B1C2); }
+    };
+
+    class A1B2C1 : public A1B2
+    {
+        public:
+            A1B2C1() { registerObject(A1B2C1); }
+    };
+
+    class A2B1C1 : public A2B1, Interface2
+    {
+        public:
+            A2B1C1() { registerObject(A2B1C1); }
+    };
+
+    class A2B2C1 : public A2B2
+    {
+        public:
+            A2B2C1() { registerObject(A2B2C1); }
+    };
+
+    class A3B1C1 : public A3B1
+    {
+        public:
+            A3B1C1() { registerObject(A3B1C1); }
+    };
+
+    class A3B1C2 : public A3B1, Interface2
+    {
+        public:
+            A3B1C2() { registerObject(A3B1C2); }
+    };
+
+    class A3B2C1 : public A3B2
+    {
+        public:
+            A3B2C1() { registerObject(A3B2C1); }
+    };
+
+    class A3B2C2 : public A3B2
+    {
+        public:
+            A3B2C2() { registerObject(A3B2C2); }
+    };
+}
+
+#endif
Index: code/branches/FICN/src/class_hierarchy/orxonox.cc
===================================================================
--- code/branches/FICN/src/class_hierarchy/orxonox.cc	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/orxonox.cc	(revision 389)
@@ -0,0 +1,294 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *
+ *
+ *   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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ *
+ *   Author:
+ *      Benjamin Knecht <beni_at_orxonox.net>, (C) 2007
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include <Ogre.h>
+#include <OIS/OIS.h>
+#include <CEGUI/CEGUI.h>
+#include <OgreCEGUIRenderer.h>
+
+#include "BaseObject.h"
+#include "Test.h"
+#include "test1.h"
+#include "test2.h"
+#include "test3.h"
+
+#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
+#include <CoreFoundation/CoreFoundation.h>
+
+// This function will locate the path to our application on OS X,
+// unlike windows you can not rely on the curent working directory
+// for locating your configuration files and resources.
+std::string macBundlePath()
+{
+  char path[1024];
+  CFBundleRef mainBundle = CFBundleGetMainBundle();
+  assert(mainBundle);
+
+  CFURLRef mainBundleURL = CFBundleCopyBundleURL(mainBundle);
+  assert(mainBundleURL);
+
+  CFStringRef cfStringRef = CFURLCopyFileSystemPath( mainBundleURL, kCFURLPOSIXPathStyle);
+  assert(cfStringRef);
+
+  CFStringGetCString(cfStringRef, path, 1024, kCFStringEncodingASCII);
+
+  CFRelease(mainBundleURL);
+  CFRelease(cfStringRef);
+
+  return std::string(path);
+}
+#endif
+
+namespace orxonox
+{
+  class OrxExitListener : public Ogre::FrameListener
+  {
+    public:
+      OrxExitListener(OIS::Keyboard *keyboard)
+    : mKeyboard(keyboard)
+      {
+      }
+
+      bool frameStarted(const Ogre::FrameEvent& evt)
+      {
+        mKeyboard->capture();
+        return !mKeyboard->isKeyDown(OIS::KC_ESCAPE);
+      }
+
+    private:
+      OIS::Keyboard *mKeyboard;
+  };
+
+  class OrxApplication
+  {
+    public:
+      void go()
+      {
+
+        #define testandcout(code) \
+          std::cout << #code << " " << code << "\n"
+
+
+        std::cout << "Test 8\n";
+
+        std::cout << "1\n";
+        Test1* test8_01 = new Test1;
+        Test3* test8_03 = new Test3;
+        test8_03->usefullClassesIsATest(test8_01);
+
+        std::cout << "2\n";
+        Test2* test8_02 = new Test2;
+        test8_03->usefullClassesIsATest(test8_02);
+
+        std::cout << "3\n";
+        test8_01->setUsefullClass1(Class(Test1));
+        test8_01->setUsefullClass1(test8_02->getIdentifier());
+        test8_01->setUsefullClass2(Class(Test2));
+        test8_01->setUsefullClassOfTypeTest3(Class(Test3));
+        test8_01->setUsefullClassOfTypeTest3(test8_03->getIdentifier());
+
+
+        testandcout(test8_01->isA(Class(Test1)));
+        testandcout(test8_01->isA(Class(Test2)));
+        testandcout(test8_01->isA(Class(Test3)));
+
+        Test2* test8_04 = new Test2;
+        testandcout(test8_02->isA(Class(Test1)));
+        testandcout(test8_02->isA(Class(Test2)));
+        testandcout(test8_02->isA(Class(Test3)));
+
+        Test3* test8_05 = new Test3;
+        testandcout(test8_03->isA(Class(Test1)));
+        testandcout(test8_03->isA(Class(Test2)));
+        testandcout(test8_03->isA(Class(Test3)));
+
+        delete test8_01;
+        delete test8_02;
+        delete test8_03;
+
+
+      }
+
+      ~OrxApplication()
+      {
+        mInputManager->destroyInputObject(mKeyboard);
+        OIS::InputManager::destroyInputSystem(mInputManager);
+
+        delete mRenderer;
+        delete mSystem;
+
+        delete mListener;
+        delete mRoot;
+      }
+
+    private:
+      Ogre::Root *mRoot;
+      OIS::Keyboard *mKeyboard;
+      OIS::Mouse *mMouse;
+      OIS::InputManager *mInputManager;
+      CEGUI::OgreCEGUIRenderer *mRenderer;
+      CEGUI::System *mSystem;
+      OrxExitListener *mListener;
+
+      void createRoot()
+      {
+#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
+        mRoot = new Ogre::Root(macBundlePath() + "/Contents/Resources/plugins.cfg");
+#else
+        mRoot = new Ogre::Root();
+#endif
+      }
+
+      void defineResources()
+      {
+        Ogre::String secName, typeName, archName;
+        Ogre::ConfigFile cf;
+#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
+        cf.load(macBundlePath() + "/Contents/Resources/resources.cfg");
+#else
+        cf.load("resources.cfg");
+#endif
+
+        Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
+        while (seci.hasMoreElements())
+        {
+          secName = seci.peekNextKey();
+          Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
+          Ogre::ConfigFile::SettingsMultiMap::iterator i;
+          for (i = settings->begin(); i != settings->end(); ++i)
+          {
+            typeName = i->first;
+            archName = i->second;
+#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
+            Ogre::ResourceGroupManager::getSingleton().addResourceLocation( String(macBundlePath() + "/" + archName), typeName, secName);
+#else
+            Ogre::ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName);
+#endif
+          }
+        }
+      }
+
+      void setupRenderSystem()
+      {
+        if (!mRoot->restoreConfig() && !mRoot->showConfigDialog())
+          throw Ogre::Exception(52, "User canceled the config dialog!", "OrxApplication::setupRenderSystem()");
+      }
+
+      void createRenderWindow()
+      {
+        mRoot->initialise(true, "Ogre Render Window");
+      }
+
+      void initializeResourceGroups()
+      {
+        Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
+        Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
+      }
+
+      void setupScene()
+      {
+        Ogre::SceneManager *mgr = mRoot->createSceneManager(Ogre::ST_GENERIC, "Default SceneManager");
+        Ogre::Camera *cam = mgr->createCamera("Camera");
+        Ogre::Viewport *vp = mRoot->getAutoCreatedWindow()->addViewport(cam);
+      }
+
+      void setupInputSystem()
+      {
+        size_t windowHnd = 0;
+        std::ostringstream windowHndStr;
+        OIS::ParamList pl;
+        Ogre::RenderWindow *win = mRoot->getAutoCreatedWindow();
+
+        win->getCustomAttribute("WINDOW", &windowHnd);
+        windowHndStr << windowHnd;
+        pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
+        mInputManager = OIS::InputManager::createInputSystem(pl);
+
+        try
+        {
+          mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, false));
+          mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject(OIS::OISMouse, false));
+        }
+        catch (const OIS::Exception &e)
+        {
+          throw new Ogre::Exception(42, e.eText, "OrxApplication::setupInputSystem");
+        }
+      }
+
+      void setupCEGUI()
+      {
+        Ogre::SceneManager *mgr = mRoot->getSceneManager("Default SceneManager");
+        Ogre::RenderWindow *win = mRoot->getAutoCreatedWindow();
+
+        // CEGUI setup
+        mRenderer = new CEGUI::OgreCEGUIRenderer(win, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mgr);
+        mSystem = new CEGUI::System(mRenderer);
+
+        // Other CEGUI setup here.
+      }
+
+      void createFrameListener()
+      {
+        mListener = new OrxExitListener(mKeyboard);
+        mRoot->addFrameListener(mListener);
+      }
+
+      void startRenderLoop()
+      {
+        mRoot->startRendering();
+      }
+  };
+}
+
+using namespace Ogre;
+
+#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
+#define WIN32_LEAN_AND_MEAN
+#include "windows.h"
+
+             INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
+#else
+             int main(int argc, char **argv)
+#endif
+{
+  try
+  {
+    orxonox::OrxApplication orxonox;
+    orxonox.go();
+  }
+  catch(Exception& e)
+  {
+#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
+    MessageBoxA(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
+#else
+    fprintf(stderr, "An exception has occurred: %s\n",
+            e.getFullDescription().c_str());
+#endif
+  }
+
+  return 0;
+}
Index: code/branches/FICN/src/class_hierarchy/test1.cc
===================================================================
--- code/branches/FICN/src/class_hierarchy/test1.cc	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/test1.cc	(revision 389)
@@ -0,0 +1,61 @@
+#include "test1.h"
+#include "test2.h"
+#include "test3.h"
+
+namespace orxonox
+{
+    Test1::Test1()
+    {
+        registerObject(Test1);
+
+        this->usefullClass1_ = Class(Test1);
+        this->usefullClass2_ = Class(Test2);
+        this->usefullClass3_ = Class(Test3);
+    }
+
+    Test1::~Test1()
+    {
+    }
+
+    bool Test1::usefullClass1isA(Identifier* identifier)
+    {
+        return this->usefullClass1_->isA(identifier);
+    }
+
+    bool Test1::usefullClass2isA(Identifier* identifier)
+    {
+        return this->usefullClass2_->isA(identifier);
+    }
+
+    bool Test1::usefullClass3isA(Identifier* identifier)
+    {
+        return this->usefullClass3_.isA(identifier);
+    }
+
+    void Test1::setUsefullClass1(Identifier* identifier)
+    {
+        std::cout << "\n";
+        std::cout << "Test1: usefullClass1->isA(Class(Test1)): " << identifier->isA(Class(Test1)) << "\n";
+        std::cout << "Test1: usefullClass1->isA(Class(Test2)): " << identifier->isA(Class(Test2)) << "\n";
+        std::cout << "Test1: usefullClass1->isA(Class(Test3)): " << identifier->isA(Class(Test3)) << "\n";
+        this->usefullClass1_ = identifier;
+    }
+
+    void Test1::setUsefullClass2(Identifier* identifier)
+    {
+        std::cout << "\n";
+        std::cout << "Test1: usefullClass2->isA(Class(Test1)): " << identifier->isA(Class(Test1)) << "\n";
+        std::cout << "Test1: usefullClass2->isA(Class(Test2)): " << identifier->isA(Class(Test2)) << "\n";
+        std::cout << "Test1: usefullClass2->isA(Class(Test3)): " << identifier->isA(Class(Test3)) << "\n";
+        this->usefullClass2_ = identifier;
+    }
+
+    void Test1::setUsefullClassOfTypeTest3(Identifier* identifier)
+    {
+        std::cout << "\n";
+        std::cout << "Test1: usefullClass3->isA(Class(Test1)): " << identifier->isA(Class(Test1)) << "\n";
+        std::cout << "Test1: usefullClass3->isA(Class(Test2)): " << identifier->isA(Class(Test2)) << "\n";
+        std::cout << "Test1: usefullClass3->isA(Class(Test3)): " << identifier->isA(Class(Test3)) << "\n";
+        this->usefullClass3_ = identifier;
+    }
+}
Index: code/branches/FICN/src/class_hierarchy/test1.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/test1.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/test1.h	(revision 389)
@@ -0,0 +1,30 @@
+#ifndef _Test1_H__
+#define _Test1_H__
+
+#include "BaseObject.h"
+#include "test3.h"
+
+namespace orxonox
+{
+    class Test1 : public BaseObject
+    {
+        public:
+            Test1();
+            virtual ~Test1();
+
+            bool usefullClass1isA(Identifier* identifier);
+            bool usefullClass2isA(Identifier* identifier);
+            bool usefullClass3isA(Identifier* identifier);
+            void setUsefullClass1(Identifier* identifier);
+            void setUsefullClass2(Identifier* identifier);
+            void setUsefullClassOfTypeTest3(Identifier* identifier);
+
+        private:
+            Identifier* usefullClass1_;
+            Identifier* usefullClass2_;
+            BaseIdentifier<Test3> usefullClass3_;
+
+    };
+}
+
+#endif
Index: code/branches/FICN/src/class_hierarchy/test2.cc
===================================================================
--- code/branches/FICN/src/class_hierarchy/test2.cc	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/test2.cc	(revision 389)
@@ -0,0 +1,61 @@
+#include "test1.h"
+#include "test2.h"
+#include "test3.h"
+
+namespace orxonox
+{
+    Test2::Test2()
+    {
+        registerObject(Test2);
+
+        this->usefullClass1_ = Class(Test1);
+        this->usefullClass2_ = Class(Test2);
+        this->usefullClass3_ = Class(Test3);
+    }
+
+    Test2::~Test2()
+    {
+    }
+
+    bool Test2::usefullClass1isA(Identifier* identifier)
+    {
+        return this->usefullClass1_->isA(identifier);
+    }
+
+    bool Test2::usefullClass2isA(Identifier* identifier)
+    {
+        return this->usefullClass2_->isA(identifier);
+    }
+
+    bool Test2::usefullClass3isA(Identifier* identifier)
+    {
+        return this->usefullClass3_.isA(identifier);
+    }
+
+    void Test2::setUsefullClass1(Identifier* identifier)
+    {
+        std::cout << "\n";
+        std::cout << "Test2: usefullClass1->isA(Class(Test1)): " << identifier->isA(Class(Test1)) << "\n";
+        std::cout << "Test2: usefullClass1->isA(Class(Test2)): " << identifier->isA(Class(Test2)) << "\n";
+        std::cout << "Test2: usefullClass1->isA(Class(Test3)): " << identifier->isA(Class(Test3)) << "\n";
+        this->usefullClass1_ = identifier;
+    }
+
+    void Test2::setUsefullClass2(Identifier* identifier)
+    {
+        std::cout << "\n";
+        std::cout << "Test2: usefullClass2->isA(Class(Test1)): " << identifier->isA(Class(Test1)) << "\n";
+        std::cout << "Test2: usefullClass2->isA(Class(Test2)): " << identifier->isA(Class(Test2)) << "\n";
+        std::cout << "Test2: usefullClass2->isA(Class(Test3)): " << identifier->isA(Class(Test3)) << "\n";
+        this->usefullClass2_ = identifier;
+    }
+
+    void Test2::setUsefullClassOfTypeTest3(Identifier* identifier)
+    {
+        std::cout << "\n";
+        std::cout << "Test2: usefullClass3->isA(Class(Test1)): " << identifier->isA(Class(Test1)) << "\n";
+        std::cout << "Test2: usefullClass3->isA(Class(Test2)): " << identifier->isA(Class(Test2)) << "\n";
+        std::cout << "Test2: usefullClass3->isA(Class(Test3)): " << identifier->isA(Class(Test3)) << "\n";
+        this->usefullClass3_ = identifier;
+    }
+}
Index: code/branches/FICN/src/class_hierarchy/test2.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/test2.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/test2.h	(revision 389)
@@ -0,0 +1,31 @@
+#ifndef _Test2_H__
+#define _Test2_H__
+
+#include "BaseObject.h"
+
+namespace orxonox
+{
+    class Test3;
+
+    class Test2 : public BaseObject
+    {
+        public:
+            Test2();
+            virtual ~Test2();
+
+            bool usefullClass1isA(Identifier* identifier);
+            bool usefullClass2isA(Identifier* identifier);
+            bool usefullClass3isA(Identifier* identifier);
+            void setUsefullClass1(Identifier* identifier);
+            void setUsefullClass2(Identifier* identifier);
+            void setUsefullClassOfTypeTest3(Identifier* identifier);
+
+        private:
+            Identifier* usefullClass1_;
+            Identifier* usefullClass2_;
+            BaseIdentifier<Test3> usefullClass3_;
+
+    };
+}
+
+#endif
Index: code/branches/FICN/src/class_hierarchy/test3.cc
===================================================================
--- code/branches/FICN/src/class_hierarchy/test3.cc	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/test3.cc	(revision 389)
@@ -0,0 +1,53 @@
+#include "test1.h"
+#include "test2.h"
+#include "test3.h"
+
+namespace orxonox
+{
+    Test3::Test3()
+    {
+        registerObject(Test3);
+    }
+
+    Test3::~Test3()
+    {
+    }
+        #define testandcout(code) \
+          std::cout << #code << " " << code << "\n"
+
+    bool Test3::usefullClassesIsATest(Test1* test1)
+    {
+        std::cout << "\n";
+        std::cout << "Test1:\n";
+        testandcout(test1->usefullClass1isA(Class(Test1)));
+        testandcout(test1->usefullClass1isA(Class(Test2)));
+        testandcout(test1->usefullClass1isA(Class(Test3)));
+        std::cout << "\n";
+        testandcout(test1->usefullClass2isA(Class(Test1)));
+        testandcout(test1->usefullClass2isA(Class(Test2)));
+        testandcout(test1->usefullClass2isA(Class(Test3)));
+        std::cout << "\n";
+        testandcout(test1->usefullClass3isA(Class(Test1)));
+        testandcout(test1->usefullClass3isA(Class(Test2)));
+        testandcout(test1->usefullClass3isA(Class(Test3)));
+        return true;
+    }
+
+    bool Test3::usefullClassesIsATest(Test2* test2)
+    {
+        std::cout << "\n";
+        std::cout << "Test2:\n";
+        testandcout(test2->usefullClass1isA(Class(Test1)));
+        testandcout(test2->usefullClass1isA(Class(Test2)));
+        testandcout(test2->usefullClass1isA(Class(Test3)));
+        std::cout << "\n";
+        testandcout(test2->usefullClass2isA(Class(Test1)));
+        testandcout(test2->usefullClass2isA(Class(Test2)));
+        testandcout(test2->usefullClass2isA(Class(Test3)));
+        std::cout << "\n";
+        testandcout(test2->usefullClass3isA(Class(Test1)));
+        testandcout(test2->usefullClass3isA(Class(Test2)));
+        testandcout(test2->usefullClass3isA(Class(Test3)));
+        return true;
+    }
+}
Index: code/branches/FICN/src/class_hierarchy/test3.h
===================================================================
--- code/branches/FICN/src/class_hierarchy/test3.h	(revision 389)
+++ code/branches/FICN/src/class_hierarchy/test3.h	(revision 389)
@@ -0,0 +1,22 @@
+#ifndef _Test3_H__
+#define _Test3_H__
+
+#include "BaseObject.h"
+
+namespace orxonox
+{
+    class Test1;
+    class Test2;
+
+    class Test3 : public BaseObject
+    {
+        public:
+            Test3();
+            virtual ~Test3();
+
+            bool usefullClassesIsATest(Test1* test1);
+            bool usefullClassesIsATest(Test2* test2);
+    };
+}
+
+#endif
Index: code/branches/FICN/src/orxonox/CMakeLists.txt
===================================================================
--- code/branches/FICN/src/orxonox/CMakeLists.txt	(revision 386)
+++ code/branches/FICN/src/orxonox/CMakeLists.txt	(revision 389)
@@ -24,4 +24,5 @@
   ${OIS_LIBRARIES}
   loader
+  audio
   network
   core
@@ -30,2 +31,3 @@
   weapon
 )
+
Index: code/branches/FICN/src/orxonox/orxonox.cc
===================================================================
--- code/branches/FICN/src/orxonox/orxonox.cc	(revision 386)
+++ code/branches/FICN/src/orxonox/orxonox.cc	(revision 389)
@@ -51,4 +51,5 @@
 #include "xml/xmlParser.h"
 #include "loader/LevelLoader.h"
+#include "audio/AudioManager.h"
 
 #include "spaceship_steering.h"
@@ -280,8 +281,11 @@
       void createScene(void)
       {
+		audio::AudioManager* auMan = new audio::AudioManager();
+
 
       string levelFile = "sp_level_moonstation.oxw";
       loader::LevelLoader* loader = new loader::LevelLoader(levelFile);
     }
+
 
     void setupScene()
