diff --git a/src/SaxParser.cpp b/src/SaxParser.cpp
index e7043edb25077adc1cd7a9907e30cc9f6a3e8f14..5b67dc0b24d3acd959506033f6e98ce5aea8d497 100644
--- a/src/SaxParser.cpp
+++ b/src/SaxParser.cpp
@@ -567,7 +567,6 @@ bool SaxParser::endElement(const QString & /* namespaceURI */,
         while(!_currentFrame.empty()) {
             frame->addElement(_currentFrame.back());
             _currentFrame.pop_back();
-            //cout<<"not adding"<<endl;
         }
 
         //compute the polydata, might increase the runtime
diff --git a/src/SyncData.cpp b/src/SyncData.cpp
index 1e6e477731964419e71861d6286e7eae14e26cab..3b6085a5b5bdcea18e6838dc1de71d35b5f2f1e1 100644
--- a/src/SyncData.cpp
+++ b/src/SyncData.cpp
@@ -66,7 +66,8 @@ SyncData::~SyncData()
 
     for(auto itr = _frames.begin(); itr != _frames.end(); itr++)
     {
-        delete itr->second;
+        //FIXME
+        //delete itr->second;
     }
     _frames.clear();
 }
@@ -141,7 +142,7 @@ Frame* SyncData::getNextFrame()
 {
 
     // this may be the case if the file only contains geometry, thus no trajectories available
-    if(_frames.empty()) return NULL;
+    if(_frames.empty()) return nullptr;
 
     // Navigation  in the negative direction is also possible
     //review
@@ -152,26 +153,39 @@ Frame* SyncData::getNextFrame()
     //FIXME: do I really need two variables to handle this?
     int cursor =_frameCursor+_frameCursorOffset;
 
-    if (cursor<0) {
+    if (cursor<0)
+    {
         //frameCursor=0;
         emit signal_controlSequences("STACK_REACHS_BEGINNING");
         _mutex.unlock();
         return NULL;
 
-    } else if ((unsigned)cursor>=_frames.size()) {
+    }
+    else if ( _frames.count(cursor)==0)
+    {
+
+        //return the last frame, if I am at the end
+        // otherwise retrun the first frame
+        Frame* res=nullptr;
+        if(_frameCursor>_frames.rbegin()->first)
+        {
+            //_frameCursor-=extern_update_step;
+            res= _frames.rbegin()->second;
+            _frameCursor=res->GetID();
+        }
+        else
+        {
+            //res=_frames.begin()->second;
+            //_frameCursor=res->GetID();
+        }
 
+        _mutex.unlock();
         //if(extern_offline_mode)
         emit signal_controlSequences("CONTROL_STACK_EMPTY");
-        //frameCursor=frames.size()-1;
-        _mutex.unlock();
-        // FIXME: check me, return the last frame, if in o
-        //return frames.at(frames.size()-1);
-        _frameCursor-=extern_update_step;
-        //return _frames.back();
-        return NULL;
+        return res;
     }
 
-    Frame* res =_frames.at(cursor);
+    Frame* res =_frames[cursor];
     _mutex.unlock();
     return res;
 }
@@ -183,31 +197,31 @@ Frame* SyncData::getNextFrame()
 * 		2. using the function getFrame(int frameNumber). one may first get
 * the current framecursor position using getFrameCursor()
 */
-Frame* SyncData::getPreviousFrame()
-{
-    _mutex.lock();
-    _frameCursor--;
-    //FIXME: do I really need two variables to handle this?
-    int cursor =_frameCursor+_frameCursorOffset;
-
-    if(cursor<0) {
-        //emit signal_controlSequences("STACK_REACHS_BEGINNING");
-        //frameCursor=0;
-        _mutex.unlock();
-        return NULL;
-    } else if((unsigned)cursor>=_frames.size() ) {
-        //emit signal_controlSequences("CONTROL_STACK_EMPTY");
-        _mutex.unlock();
-        //frameCursor=frames.size()-1;
-        return NULL;
-    }
+//Frame* SyncData::getPreviousFrame()
+//{
+//    _mutex.lock();
+//    _frameCursor--;
+//    //FIXME: do I really need two variables to handle this?
+//    int cursor =_frameCursor+_frameCursorOffset;
+
+//    if(cursor<0) {
+//        //emit signal_controlSequences("STACK_REACHS_BEGINNING");
+//        //frameCursor=0;
+//        _mutex.unlock();
+//        return NULL;
+//    } else if((unsigned)cursor>=_frames.size() ) {
+//        //emit signal_controlSequences("CONTROL_STACK_EMPTY");
+//        _mutex.unlock();
+//        //frameCursor=frames.size()-1;
+//        return NULL;
+//    }
 
-    Frame* res =_frames.at(cursor);
+//    Frame* res =_frames.at(cursor);
 
-    _mutex.unlock();
+//    _mutex.unlock();
 
-    return res;
-}
+//    return res;
+//}
 
 void SyncData::clearFrames()
 {
@@ -219,10 +233,10 @@ void SyncData::clearFrames()
     _pedHeight.clear();
     _pedColor.clear();
 
-//    while (!_frames.empty()) {
-//        delete _frames.back();
-//        _frames.pop_back();
-//    }
+    //    while (!_frames.empty()) {
+    //        delete _frames.back();
+    //        _frames.pop_back();
+    //    }
     _frames.clear();
     _mutex.unlock();
 }
@@ -244,7 +258,6 @@ void SyncData::resetFrameCursor()
 
 int SyncData::getFrameCursor()
 {
-
     return _frameCursor;
 }
 
diff --git a/src/TimerCallback.cpp b/src/TimerCallback.cpp
index 5a695509210d99dd6b2e32fce48285b5467d14de..3ed2cf62af55a15466cd0c565c5842379cb8d0da 100644
--- a/src/TimerCallback.cpp
+++ b/src/TimerCallback.cpp
@@ -136,14 +136,21 @@ void TimerCallback::Execute(vtkObject *caller, unsigned long eventId,
                     // e.g showing captions/trails...
 
                     if(extern_is_pause)
+                    {
                         frame=extern_trajectories_firstSet.getFrame(extern_trajectories_firstSet.getFrameCursor());
+                    }
                     else
+                    {
                         frame = extern_trajectories_firstSet.getNextFrame();
+                    }
+
+                        frameNumber=extern_trajectories_firstSet.getFrameCursor();
 
-                    if(frame==NULL) {
+                    if(frame==NULL)
+                    {
 
                     } else {
-                        frameNumber=extern_trajectories_firstSet.getFrameCursor();
+
                         nPeds= frame->getSize();
 
                         if(SystemSettings::get2D()==true) {