Index: orxonox/trunk/src/lib/util/list.h
===================================================================
--- orxonox/trunk/src/lib/util/list.h	(revision 4506)
+++ orxonox/trunk/src/lib/util/list.h	(revision 4508)
@@ -110,4 +110,5 @@
   int getSize();
   //T* enumerate();
+  bool inList(T* entity);
   tIterator<T>* getIterator();
   T* nextElement(T* toEntity);
@@ -258,4 +259,27 @@
 }
 
+/**
+   \brief checks if an entity is in the List
+   \param entity The entity to check for in the entire List.
+   \returns true if it is, false otherwise
+*/
+template<class T>
+inline bool tList<T>::inList(T* entity)
+{  
+  // pre checks
+  if(this->size == 0) return false;
+  if( entity == NULL) return false;
+
+  // search in the List
+  this->currentEl = this->first;
+  while(this->currentEl->curr != entity && this->currentEl != NULL)
+    this->currentEl = this->currentEl->next;
+
+  // post checks
+  if(this->currentEl == NULL) 
+    return false;
+  else
+    return true;
+}
 
 /**
Index: orxonox/trunk/src/story_entities/world.cc
===================================================================
--- orxonox/trunk/src/story_entities/world.cc	(revision 4506)
+++ orxonox/trunk/src/story_entities/world.cc	(revision 4508)
@@ -570,4 +570,5 @@
   trackManager->addPointV(Vector(970, 24, 40));
   trackManager->addPointV(Vector(1000, 40, -7));
+
   trackManager->setDuration(4);
       
Index: orxonox/trunk/src/util/track/track_manager.cc
===================================================================
--- orxonox/trunk/src/util/track/track_manager.cc	(revision 4506)
+++ orxonox/trunk/src/util/track/track_manager.cc	(revision 4508)
@@ -149,36 +149,46 @@
 
 /**
-   \brief checks if there are any BackLoops in the Track (Backloops only 
-   \param trackElem the trackElement to check about
-   \param depth the depth to search in
+   \brief checks if there are any BackLoops in the Track
    \returns true if NO loop was found, false Otherwise
    You actually have to act on false!!
-   it simply does this by looking if the current trackElem is found again somewhere else in the Track
-
-   \todo this has to be reimplemented
-*/
-bool TrackElement::backLoopCheck(const TrackElement* trackElem, unsigned int depth) const
-{
-  if(depth == 0 || this != trackElem)
-    {
-      if (this->children)
-	{
-	  tIterator<TrackElement>* iterator = this->children->getIterator();
-	  TrackElement* enumElem = iterator->nextElement();
-	  while (enumElem)
-	    {
-	      if(!enumElem->backLoopCheck(trackElem, depth + 1))
-		return false;
-	      enumElem = iterator->nextElement();
-	    }
-	  delete iterator;
-	}
-    }
-  else
-    return false;
-
+*/
+bool TrackElement::backLoopCheck(void) const
+{
+  tList<const TrackElement>* trackList = new tList<const TrackElement>;
+  
+  this->backLoopCheckAtomic(trackList);
+  
+  delete trackList;
   // only returns if everything worked out
   return true;
 }
+
+/**
+   \brief checks if there are any BackLoops in the Track.
+   \param trackList A list of stored tracks, to search in.
+   \returns true if NO loop was found, false Otherwise
+   You actually have to act on false!!
+*/
+bool TrackElement::backLoopCheckAtomic(tList<const TrackElement>* trackList) const
+{
+  if (trackList->inList(this))
+    return false;
+
+  trackList->add(this);
+
+  if (this->children)
+    {
+      tIterator<TrackElement>* iterator = this->children->getIterator();
+      TrackElement* enumElem = iterator->nextElement();
+      while (enumElem)
+	{
+	  if (!enumElem->backLoopCheckAtomic(trackList))
+	    return false;
+	}
+      delete iterator;
+    }
+  return true;
+}
+
 
 /**
@@ -264,5 +274,5 @@
     PRINT(0)("   is Joined at the End\n");
   
-  if(!this->backLoopCheck(this)) /* this should not happen */
+  if(!this->backLoopCheck()) /* this should not happen */
     PRINT(2)(" THERE IS A BACKLOOP TO THIS ELEMENT\n");
 }
@@ -916,5 +926,5 @@
   // checking if there is a back-loop-connection and ERROR if it is.
   tmpTrackElem = this->firstTrackElem->findByID(trackIDs[0]);
-  if (!tmpTrackElem->backLoopCheck(tmpTrackElem))
+  if (!tmpTrackElem->backLoopCheck())
     {
       PRINTF(2)("Backloop connection detected at joining trackElements\n -> TRACK WILL NOT BE JOINED\n");
Index: orxonox/trunk/src/util/track/track_manager.h
===================================================================
--- orxonox/trunk/src/util/track/track_manager.h	(revision 4506)
+++ orxonox/trunk/src/util/track/track_manager.h	(revision 4508)
@@ -48,5 +48,5 @@
   TrackElement* findByID(unsigned int trackID);
   TrackElement* findByName(const char* trackName);
-  bool backLoopCheck(const TrackElement* trackElem, unsigned int depth = 0) const;
+  bool backLoopCheck(void) const;
 
   TrackElement* getChild(int childNumber) const;
@@ -55,5 +55,8 @@
   inline const char* getName(void) const { return this->name; };
 
-
+ private:
+  bool backLoopCheckAtomic(tList<const TrackElement>* trackList) const;
+
+ public:
   // atributes
   bool                  isFresh;              //!< If no Points where added until now
