diff --git a/src/common/Errors.cpp b/src/common/Errors.cpp
index b1efe17bdde27740a87e1311695ae33a89ca44d5..44b7f2b1762af43ee66f4f6be012848b92de3e23 100644
--- a/src/common/Errors.cpp
+++ b/src/common/Errors.cpp
@@ -203,7 +203,7 @@ void Error::flush(const string &filename){
             return;
         }
         else {
-            outfile << "File " << Message::get_interface()->get_filename() << endl << endl;
+            outfile << "File " << Message::get_interface()->get_filename().back() << endl << endl;
 
             if(!_errors.empty()) {
                 outfile << "Errors :" << endl;
diff --git a/src/common/Info.cpp b/src/common/Info.cpp
index e8208b15bf057f4d1969469cd2d0859ce10bed37..abc5cfefcdf1c59a83c269803a5c151341988e3f 100644
--- a/src/common/Info.cpp
+++ b/src/common/Info.cpp
@@ -68,10 +68,6 @@ Element_pos Info::Render::height = 100; /* 100 OpenGL units for 1 pixel  */
 
 bool        Info::Render::_key_alt  = false;
 bool        Info::Render::_key_ctrl = false;
-Element_pos Info::Render::_x_min_visible = 0.0;
-Element_pos Info::Render::_x_max_visible = 0.0;
-Element_pos Info::Render::_x_min = 0.0;
-Element_pos Info::Render::_x_max = 0.0;
 
 Element_pos Info::Render::_info_x = 0.0;
 Element_pos Info::Render::_info_y = 0.0;
@@ -103,11 +99,6 @@ void Info::release_all(){
     Info::Container::y_min = 0;
     Info::Container::y_max = 0;
 
-    Info::Entity::x_min = 0;
-    Info::Entity::x_max = 0;
     Info::Entity::y_min = 0;
     Info::Entity::y_max = 0;
-
-    Info::Render::_x_min_visible = 0.0;
-    Info::Render::_x_max_visible = 0.0;
 }
diff --git a/src/common/Info.hpp b/src/common/Info.hpp
index 0e609eb8527c2eb010317b4ae8e02605c345f90f..1f4a8046960c78f9d8598f8e77cbb2f19304f4ca 100644
--- a/src/common/Info.hpp
+++ b/src/common/Info.hpp
@@ -199,26 +199,6 @@ public:
          */
         static bool _vertical_line;
 
-        /*!
-         * \brief Contains the trace minimum visible time.
-         */
-        static Element_pos _x_min_visible;
-
-        /*!
-         * \brief Contains the trace maximum visible time.
-         */
-        static Element_pos _x_max;
-
-        /*!
-         * \brief Contains the trace minimum visible time, uncorrected (state width isn't removed)
-         */
-        static Element_pos _x_min;
-
-        /*!
-         * \brief Contains the trace maximum visible time.
-         */
-        static Element_pos _x_max_visible;
-
         /*!
          * \brief Contains the x position of selection.
          */
diff --git a/src/core/Core.cpp b/src/core/Core.cpp
index 245354d1b291ae887ced175751155729b4eb4fac..b879c347d33bb60608117bee39655fa5d47f772e 100644
--- a/src/core/Core.cpp
+++ b/src/core/Core.cpp
@@ -155,7 +155,6 @@ using namespace std;
 
 Core::Core(int &argc, char ** argv)
 {
-
     /* Initialize global variable */
     waitGUIInit          = nullptr;
     _is_window_displayed = false;
@@ -218,8 +217,8 @@ Core::Core(int &argc, char ** argv)
 
 Core::~Core(){
 
-    if( _trace != nullptr )
-        delete _trace;
+    for (int i = 0; i < _traces.size(); i++)
+        delete _traces[i];
 
     if ( _run_env[0] != nullptr )
         delete _run_env[0];
@@ -227,9 +226,9 @@ Core::~Core(){
     if ( _run_env[1] != nullptr )
         delete _run_env[1];
 
-    if (_render_windowed != nullptr ) {
-        _render_windowed->release();
-        delete _render_windowed;
+    for (int i = 0; i < _renders.size(); i++) {
+        _renders[i]->release();
+        delete _renders[i];
     }
 
     /* Qt desallocates _main_window and _render_windowed automatically */
@@ -323,14 +322,14 @@ int Core::get_options(int &argc, char **argv)
             break;
 
         case 'i' :
-            _file_opened = optarg;
+            _files_opened.push_back(optarg);
             if (state == 0)
                 state = _STATE_OPEN_FILE;
             break;
 
         case 's' :
             // We want to split the file and save its parts
-            _file_opened = optarg;
+            _files_opened.push_back(optarg);
             Info::Splitter::split=true;
             if (state == 0) state = _STATE_SPLITTING ;
             break;
@@ -381,7 +380,7 @@ int Core::get_options(int &argc, char **argv)
 
     if(optind < argc)
     {
-        _file_opened = largv[optind];
+        _files_opened.push_back(largv[optind]);
         if (state == 0) state = _STATE_OPEN_FILE;
     }
 
@@ -400,7 +399,7 @@ int Core::get_options(int &argc, char **argv)
  *
  **********************************/
 
-bool Core::draw_trace(const string & filename, const int format) {
+bool Core::draw_trace(const std::string & filename, const int format, int index) {
     delete parser;
     parser = nullptr;
     DrawTrace  drawing_ogl;
@@ -428,15 +427,16 @@ bool Core::draw_trace(const string & filename, const int format) {
         _main_window->update_recent_files_menu();
     }
 
-    if (nullptr == _trace) { /* no trace is loaded, parse the file */
+    while (_traces.size() <= index) {
+        this->launch_action(_STATE_OPEN_NEW_RENDER_AREA, &index);
+    }
+
+    if (nullptr == _traces[index]) { /* no trace is loaded, parse the file */
 
-        /* Init data */
-        Info::Entity::x_min          = 0;
-        Info::Entity::x_max          = 0;
-        Info::Render::_x_min_visible = 0;
-        Info::Render::_x_max_visible = 0;
+        Info::Entity::x_min = 0;
+        Info::Entity::x_max = 0;
 
-        _trace = new Trace();
+        _traces[index] = new Trace();
 
         // Init of the thread
         _finished = new QWaitCondition();
@@ -445,7 +445,7 @@ bool Core::draw_trace(const string & filename, const int format) {
 
         QThread thread;
 
-        ParsingThread pt(parser, _trace, _finished,_closed, _mutex);
+        ParsingThread pt(parser, _traces[index], _finished,_closed, _mutex);
 
         pt.moveToThread(&thread);
         qRegisterMetaType<std::string>("std::string");
@@ -465,8 +465,8 @@ bool Core::draw_trace(const string & filename, const int format) {
         }
 
 #if defined(USE_ITC) && defined(BOOST_SERIALIZE)
-        if(Info::Splitter::path.empty())Info::Splitter::path=QFileInfo(_file_opened.c_str()).dir().path().toStdString();
-        if(Info::Splitter::filename.empty())Info::Splitter::filename=QFileInfo(_file_opened.c_str()).baseName().toStdString();
+        if(Info::Splitter::path.empty())Info::Splitter::path=QFileInfo(_files_opened.back().c_str()).dir().path().toStdString();
+        if(Info::Splitter::filename.empty())Info::Splitter::filename=QFileInfo(_files_opened.back().c_str()).baseName().toStdString();
 
         if(Info::Splitter::xml_filename.empty() && !_xml_config_file.empty())Info::Splitter::xml_filename=_xml_config_file;
         if(Info::Splitter::split==true){
@@ -546,7 +546,7 @@ bool Core::draw_trace(const string & filename, const int format) {
             loaded   = (int)(loaded_f*100.0f);
 
             if(parser->is_end_of_parsing() && !killed){
-                if(!_xml_config_file.empty() && _trace->get_view_root_containers()->empty()){//if we have a partial loading, process it here, but only once
+                if(!_xml_config_file.empty() && _traces[index]->get_view_root_containers()->empty()){//if we have a partial loading, process it here, but only once
                     launch_action(_DRAW_OPENGL_PARTIAL,nullptr);
                 }
 
@@ -629,27 +629,38 @@ bool Core::draw_trace(const string & filename, const int format) {
 
         delete parser;
         parser=nullptr;
+
+        _renders[index]->entities_x_min = Info::Entity::x_min;
+        _renders[index]->entities_x_max = Info::Entity::x_max;
     }
-    else if ( _file_opened != filename) {/* just check if execution is normal */
-        *Message::get_instance() << "Try to use file: " << filename << " instead of a previous parsed file: " << _file_opened << Message::ende;
+    else if (index < _files_opened.size()) {
+        if ( _files_opened[index] != filename) {/* just check if execution is normal */
+            *Message::get_instance() << "Try to use file: " << filename << " instead of a previous parsed file: " << _files_opened[index] << Message::ende;
+        }
     }
-    if(_trace!=nullptr && !killed){
-        if (Info::Render::_x_min_visible == Info::Render::_x_max_visible){ // first time
-            _trace->set_interval_constrained(new Interval(0,_trace->get_max_date()));
+
+
+    if(_traces[index]!=nullptr && !killed){
+        if (_renders[index]->_x_min_visible == _renders[index]->_x_max_visible){ // first time
+            _traces[index]->set_interval_constrained(new Interval(0,_traces[index]->get_max_date()));
         }else{
-            _trace->set_interval_constrained(new Interval(Info::Render::_x_min_visible, Info::Render::_x_max_visible));
+            _traces[index]->set_interval_constrained(new Interval(_renders[index]->_x_min_visible, _renders[index]->_x_max_visible));
         }
 
-        if(!_xml_config_file.empty() && _trace->get_view_root_containers()->empty()){//if we have a partial loading, process it here, but only once
+        if(!_xml_config_file.empty() && _traces[index]->get_view_root_containers()->empty()){//if we have a partial loading, process it here, but only once
             launch_action(_DRAW_OPENGL_PARTIAL,nullptr);
         }
         if (_DRAW_OPENGL == format) {
-            GanttDiagram render(_render_windowed);
-            drawing_ogl.build(&render, _trace);
-            _render_windowed->build();
+            GanttDiagram render(_renders[index]);
+            drawing_ogl.build(&render, _traces[index]);
+            _renders[index]->build();
             // _render_windowed->update();
-            _render_windowed->refresh_scroll_bars();
-            _file_opened = filename;/* store filename for a future export */
+            _renders[index]->refresh_scroll_bars();
+            if (index < _files_opened.size()) { /* store filename for a future export */
+                _files_opened[index] = filename;
+            } else {
+                _files_opened.push_back(filename);
+            }
         }
         else if (_DRAW_SVG == format) {
 
@@ -661,25 +672,25 @@ bool Core::draw_trace(const string & filename, const int format) {
             buf_max = Info::Entity::x_max;
 
             /* Change current view to fit the user zoom */
-            Info::Render::_x_min_visible = _time_start;
+            rsvg->_x_min_visible = _time_start;
 
             if(_time_end == 0.) {
-                Info::Render::_x_max_visible = _trace->get_max_date().get_value();
-                Info::Entity::x_max = Info::Render::_x_max_visible;
+                rsvg->_x_max_visible = _traces[index]->get_max_date().get_value();
+                Info::Entity::x_max = rsvg->_x_max_visible;
             }
             else {
-                Info::Render::_x_max_visible = _time_end;
+                rsvg->_x_max_visible = _time_end;
             }
 
-            if(Info::Entity::x_max >= Info::Render::_x_min_visible) {
-                Info::Entity::x_min = Info::Render::_x_min_visible;
+            if(Info::Entity::x_max >= rsvg->_x_min_visible) {
+                Info::Entity::x_min = rsvg->_x_min_visible;
             }
             if(_time_end > _time_start && _time_end <= Info::Entity::x_max) {
                 Info::Entity::x_max = _time_end;
             }
             cout << "Exporting trace to " << _path_to_export<<" ... Please Wait " << endl ;
             GanttDiagram render(rsvg);
-            drawing_ogl.build(&render, _trace);
+            drawing_ogl.build(&render, _traces[index]);
 
             delete(rsvg);/* Release the svg render */
 
@@ -732,7 +743,7 @@ void Core::launch_action(int state, void* arg) {
         break;
 
     case _STATE_OPEN_FILE:
-        message << QObject::tr("Opening the file: ").toStdString ()+_file_opened
+        message << QObject::tr("Opening the file: ").toStdString ()+_files_opened.back()
                 << Message::endi;
 
         __attribute__((fallthrough));
@@ -741,6 +752,32 @@ void Core::launch_action(int state, void* arg) {
 
         waitGUIInit = new QEventLoop(this);
 
+        _main_window = new Interface_graphic(this);/* launch the window interface */
+        Message::set_interface(_main_window);/* define which interface will receive messages */
+
+        connect(this, &Core::close_windows,
+                _main_window, &Interface_graphic::on_quit_triggered);
+
+        int zero = 0;
+        this->launch_action(_STATE_OPEN_NEW_RENDER_AREA, &zero);
+
+        /* Wait that the open gl renderer calls waitGUIInit->quit() to load the file */
+        waitGUIInit->exec();
+        if (_STATE_OPEN_FILE == state) {
+            _main_window->opening_file(
+                    _files_opened.back());/* Must be called after binding the render area to the main window */
+            if (false == draw_trace(_files_opened.back(), _DRAW_OPENGL, 0)) {
+                message << QObject::tr("Draw trace failed").toStdString()
+                        << Message::ende;
+                break;
+            }
+        }
+
+        _is_window_displayed = true;
+        break;
+    }
+
+    case _STATE_OPEN_NEW_RENDER_AREA: {
         // Check the compatibility of the system with the render engine
 #ifndef USE_VULKAN
         QGLFormat format(QGL::HasOverlay);
@@ -755,31 +792,33 @@ void Core::launch_action(int state, void* arg) {
         if (!QGLFormat::hasOpenGL())
             qFatal("This system has no OpenGL support");
 #endif
-
-        _main_window = new Interface_graphic(this);/* launch the window interface */
-        Message::set_interface(_main_window);/* define which interface will receive messages */
-
-        connect(this, &Core::close_windows,
-                _main_window, &Interface_graphic::on_quit_triggered);
-
+        int index = *((int*) arg);
+        if (index >= _main_window->numberOfRenders())
+            _main_window->addRender();
+        
         //   format.setOverlay(true);
 #ifdef USE_VULKAN
-        _render_windowed = new Render_vulkan(this, _main_window);
+        _renders.push_back(new Render_vulkan(this, _main_window));
 #else
 #ifdef VITE_ENABLE_VBO
-        _render_windowed = new Render_alternate(this, _main_window, format);
+        if (index >= _renders.size())
+            _renders.push_back(new Render_alternate(this, _main_window, format));
 #else
-        _render_windowed = new Render_opengl (this, _main_window, format);
+        _renders.push_back(new Render_opengl(this, _main_window, format));
 #endif
 #endif
+        if (index >= _traces.size())
+            _traces.push_back(nullptr);
+
+        Render_windowed* render = _renders[_renders.size() - 1];
 
-        if (nullptr == _render_windowed) {
+        if (nullptr == render) {
             message << QObject::tr("Cannot allocate memory for an OpengGL instance").toStdString()
                     << Message::ende;
             break;
         }
 
-        if (!_render_windowed->is_validated()) {
+        if (!render->is_validated()) {
             break;
         }
 
@@ -791,34 +830,25 @@ void Core::launch_action(int state, void* arg) {
         //     else
         //         message <<  QObject::tr("An overlay format was originally asked, but was not created").toStdString () << Message::endw;
         // }
-        _main_window->bind_render_area(_render_windowed, 0);
-
-        /* Wait that the open gl renderer calls waitGUIInit->quit() to load the file */
-        waitGUIInit->exec();
-        if (_STATE_OPEN_FILE == state) {
-            _main_window->opening_file(
-                    _file_opened);/* Must be called after binding the render area to the main window */
-            if (false == draw_trace(_file_opened, _DRAW_OPENGL)) {
-                message << QObject::tr("Draw trace failed").toStdString()
-                        << Message::ende;
-                break;
-            }
-        }
+        _main_window->bind_render_area(render, _renders.size() - 1);
 
         // If -t has been set, we define the interval to zoom in
-        if (_time_start != 0 && _time_end == 0.)
-            _time_end = _trace->get_max_date().get_value();
+        if (_time_start != 0 && _time_end == 0.) {
+            Trace* trace = _traces[_traces.size() - 1];
+            _time_end = trace->get_max_date().get_value();
+        }
 
         if (_time_end != 0.) {
-            _render_windowed->apply_zoom_on_interval(_time_start, _time_end);
+            render->apply_zoom_on_interval(_time_start, _time_end);
         }
 
-        _is_window_displayed = true;
+        QApplication::processEvents();
+
         break;
     }
     case _STATE_SPLITTING:
-        *Message::get_instance() << "Splitting " << _file_opened << Message::endi;
-        draw_trace(_file_opened, _STATE_SPLITTING);
+        *Message::get_instance() << "Splitting " << _files_opened.back() << Message::endi;
+        draw_trace(_files_opened.back(), _STATE_SPLITTING, 0);
         break;
 
 
@@ -838,25 +868,34 @@ void Core::launch_action(int state, void* arg) {
          _closed->wait(_mutex,100);
          }*/
 
-        if (_render_windowed->unbuild() == false)
-            message << "Close file : an error occured with trace releasing." << Message::ende;
-        _file_opened.clear();
-
-
         if (false == _is_trace_loaded) {
             *Message::get_instance() << "Try to release a render area whereas no file was loaded" << Message::ende;
-        } else {
-            _is_trace_loaded = false;
         }
 
-        if (nullptr == _trace) {
-            *Message::get_instance() << "Try to release a render area whereas no trace is loaded" << Message::ende;
-        } else {
-            delete _trace;
-            _trace = nullptr;
-        }
-        _render_windowed->update_render();
+        // releases last render
+        Render_windowed* render = _renders.back(); 
 
+        if (render->unbuild() == false)
+            message << "Close file : an error occured with trace releasing." << Message::ende;
+
+        render->update_render();
+        _files_opened.pop_back();
+      
+        if (!_traces.empty()) {
+            Trace* trace =  _traces.back();
+            _traces.pop_back();
+
+            if (nullptr == trace) {
+                *Message::get_instance() << "Try to release a render area whereas no trace is loaded" << Message::ende;
+            } else {
+                delete trace;
+                _traces[_traces.size()] = nullptr;
+            }
+        }
+        
+        if (_traces.size() == 0) {
+            _is_trace_loaded = false;
+        }
         /* Release all data */
         Info::release_all();
     }
@@ -865,12 +904,12 @@ void Core::launch_action(int state, void* arg) {
     case _STATE_EXPORT_FILE:
     case _STATE_EXPORT_FILE_IN_INTERVAL:
     {
-        if (_file_opened.empty()) {
+        if (_files_opened.empty()) {
             *Message::get_instance() << "Please to previously open a trace." << Message::endw;
             return;
         }
 
-        cout << "export of " << _file_opened << " to " << _path_to_export << " between ";
+        cout << "export of " << _files_opened.back() << " to " << _path_to_export << " between ";
         if(_time_start == 0){
             cout << "the beginning of the trace to ";
         }
@@ -884,41 +923,55 @@ void Core::launch_action(int state, void* arg) {
             cout << "the end of the trace." << endl;
         }
 
-        draw_trace(_file_opened, _DRAW_SVG);
+        draw_trace(_files_opened.back(), _DRAW_SVG, 0);
     }
     break;
 
     case _STATE_RENDER_AREA_CHANGE_TRANSLATE:
-        _render_windowed->change_translate( *((int*)arg) );
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->change_translate( *((int*)arg) );
+        }
         break;
 
     case _STATE_RENDER_AREA_CHANGE_SCALE:
-        _render_windowed->change_scale( *((Element_pos*)arg) );
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->change_scale( *((Element_pos*)arg) );
+        }
         break;
 
     case _STATE_RENDER_AREA_CHANGE_SCALE_Y:
-        _render_windowed->change_scale_y( *((Element_pos*)arg) );
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->change_scale_y( *((Element_pos*)arg) );
+        }
         break;
 
     case _STATE_RENDER_AREA_CHANGE_CONTAINER_SCALE:
-        _render_windowed->change_scale_container_state( *((int*)arg) );
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->change_scale_container_state( *((int*)arg) );
+        }
         break;
 
     case _STATE_RENDER_AREA_REPLACE_SCALE:
-        _render_windowed->replace_scale( *((Element_pos*)arg) );
-        _render_windowed->replace_scale_y( *((Element_pos*)arg) );
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->replace_scale( *((Element_pos*)arg) );
+            _renders[i]->replace_scale_y( *((Element_pos*)arg) );
+        }
         break;
 
     case _STATE_RENDER_AREA_REPLACE_TRANSLATE:
-        _render_windowed->replace_translate( *((Element_pos*)arg) );
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->replace_translate( *((Element_pos*)arg) );
+        }
         break;
 
     case _STATE_RENDER_AREA_REPLACE_TRANSLATE_Y:
-        _render_windowed->replace_translate_y( *((Element_pos*)arg) );
+        _renders[*((int*) ((void**)arg)[0])]->replace_translate_y( *((Element_pos*) ((void**)arg)[1]) );
         break;
 
     case _STATE_RENDER_AREA_REGISTERED_TRANSLATE:
-        _render_windowed->registered_translate( *((int*)arg) );
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->registered_translate( *((int*)arg) );
+        }
         break;
 
     case _STATE_AJUST_SCROLL_BARS:
@@ -935,28 +988,49 @@ void Core::launch_action(int state, void* arg) {
         break;
 
     case _STATE_RENDER_DISPLAY_INFORMATION:
-        if(_trace != nullptr){
-            buf.display_information(_trace, Info::Render::_info_x, Info::Render::_info_y, Info::Render::_info_accurate);
+        for (int i = 0; i < _traces.size(); i++) {
+            if(_traces[i] != nullptr){
+                buf.display_information(_traces[i], Info::Render::_info_x, Info::Render::_info_y, Info::Render::_info_accurate);
+            }
         }
         break;
 
     case _STATE_RENDER_UPDATE:
-        _render_windowed->update_render();
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->update_render();
+        }
         break;
 
     case _STATE_CLEAN_RENDER_AREA:
     {
-        Info::Render::_x_min_visible = 0.0;
-        Info::Render::_x_max_visible = 0.0;
-        if (_render_windowed->unbuild() == false)
-            message << "Close file : an error occured while cleaning the render." << Message::ende;
-        _render_windowed->release();
-        _render_windowed->update_render();
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->_x_min_visible = 0.0;
+            _renders[i]->_x_max_visible = 0.0;
+            if (_renders[i]->unbuild() == false)
+                message << "Close file : an error occured while cleaning the render." << Message::ende;
+            _renders[i]->release();
+            _renders[i]->update_render();
+        }
     }
     break;
+    
+    case _STATE_REMOVE_RENDER_AREA:
+    {   
+            Render_windowed* render = _renders.back();
+            _renders.pop_back();
+
+            delete render;
+            _renders[_renders.size()] = nullptr;
+
+            if(_renders.size() > 0)
+                _main_window->removeRender();
+        break;
+    }
 
     case _STATE_RENDER_SHOW_MINIMAP:
-        _render_windowed->show_minimap();
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->show_minimap();
+        }
         break;
 
     case _STATE_SWITCH_CONTAINERS:
@@ -965,8 +1039,8 @@ void Core::launch_action(int state, void* arg) {
         Element_pos yr2 = ((Element_pos*)arg)[1];
         const Container* container=nullptr;
         const Container* container2=nullptr;
-        const Container::Vector *root_containers = _trace->get_view_root_containers();
-        if(root_containers->empty())root_containers= _trace->get_root_containers();
+        const Container::Vector *root_containers = _traces[0]->get_view_root_containers();
+        if(root_containers->empty())root_containers= _traces[0]->get_root_containers();
         if (!root_containers->empty()){
             for (const auto &root_container : *root_containers)
                 if ((container = buf.search_container_by_position(root_container, yr)))
@@ -986,10 +1060,10 @@ void Core::launch_action(int state, void* arg) {
             return;
 
         //we found the two children containers, we have to know the depth
-        Element_pos xr = ((Element_pos*)arg)[2] * (_trace->get_depth()+1);
+        Element_pos xr = ((Element_pos*)arg)[2] * (_traces[0]->get_depth()+1);
         if(xr<0)return;
 
-        Element_pos xr2 = ((Element_pos*)arg)[3] * (_trace->get_depth()+1);
+        Element_pos xr2 = ((Element_pos*)arg)[3] * (_traces[0]->get_depth()+1);
         if(xr2<0)return;
         for(int i=0; i < (const_cast<Container*>(container)->get_depth() - xr); i++){
             container= container->get_parent();
@@ -1014,9 +1088,9 @@ void Core::launch_action(int state, void* arg) {
         bool children_allocated = false;
 
         if( parent == nullptr ) {//we switch top level containers
-            children = _trace->get_view_root_containers();
+            children = _traces[0]->get_view_root_containers();
             if( children->empty() )
-                children = _trace->get_root_containers();
+                children = _traces[0]->get_root_containers();
         } else {
             children = new std::list<Container*>(*parent->get_view_children());
             if( children->empty() ) {
@@ -1051,20 +1125,21 @@ void Core::launch_action(int state, void* arg) {
                 else
                     new_list->push_back(*it);
             }
-            _trace->set_view_root_containers(*new_list);
+            _traces[0]->set_view_root_containers(*new_list);
             delete new_list;
         }
 
-        Element_pos zoom[2]={Info::Render::_x_min, Info::Render::_x_max};
-        Info::Render::_x_min_visible = 0.0;
-        Info::Render::_x_max_visible = 0.0;
-
         launch_action(Core:: _STATE_CLEAN_RENDER_AREA);
-#if defined(USE_ITC) && defined(BOOST_SERIALIZE)
-        _trace->updateTrace(new Interval(zoom[0], zoom[1]));
-#endif
-        draw_trace(get_filename(),Core::_DRAW_OPENGL);
-        launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &zoom);
+
+        for (int i = 0; i < _renders.size(); i++) {
+            Element_pos zoom[3] = {_renders[i]->_x_min, _renders[i]->_x_max, (Element_pos) i};
+
+    #if defined(USE_ITC) && defined(BOOST_SERIALIZE)
+            _traces[i]->updateTrace(new Interval(zoom[0], zoom[1]));
+    #endif
+            draw_trace(get_filename().back(),Core::_DRAW_OPENGL, i);
+            launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &zoom);
+        }
         launch_action(Core:: _STATE_RENDER_UPDATE);
 
         if ( children_allocated ) {
@@ -1077,7 +1152,7 @@ void Core::launch_action(int state, void* arg) {
     case _DRAW_OPENGL_PARTIAL:
     {
         //_main_window->get_node_select()->set_trace(_trace);
-        bool xml_success = _trace->load_config_from_xml(QString::fromStdString(_xml_config_file));
+        bool xml_success = _traces[0]->load_config_from_xml(QString::fromStdString(_xml_config_file));
         if(!xml_success){
             //std::list<Container *> displayed_containers;
             //_main_window->get_node_select()->build_displayed_nodes(displayed_containers);
@@ -1089,15 +1164,19 @@ void Core::launch_action(int state, void* arg) {
     }
     case _STATE_ZOOM_IN_AN_INTERVAL:
     {
-        _render_windowed->apply_zoom_on_interval(((Element_pos*)arg)[0], ((Element_pos*)arg)[1]);
+        for (int i = 0; i < _renders.size(); i++) {
+            _renders[i]->apply_zoom_on_interval(((Element_pos*)arg)[0], ((Element_pos*)arg)[1]);
+        }
     }
     break;
 
     case _STATE_UPDATE_VARVALUES:
     {
-        if( nullptr != _trace ) {
-            std::map<long int, double> var_map = _trace->update_text_variable_values(((Element_pos*)arg)[0]);
-            buf.draw_text_variable_values(_render_windowed, &var_map, ((Element_pos*)arg)[0]);
+        for (int i = 0; i < _traces.size(); i++) {
+            if( nullptr != _traces[i] ) {
+                std::map<long int, double> var_map = _traces[i]->update_text_variable_values(((Element_pos*)arg)[0]);
+                buf.draw_text_variable_values(_renders[i], &var_map, ((Element_pos*)arg)[0]);
+            }
         }
     }
     break;
@@ -1113,7 +1192,7 @@ void Core::launch_action(int state, void* arg) {
         char args[512];
         sprintf(args,"-t %lf:%lf", _time_start, _time_end);
         QStringList arguments = (QStringList() << QString::fromStdString(args));
-        arguments << QString::fromStdString(_file_opened);
+        arguments << QString::fromStdString(_files_opened.back());
         QString program;
 
         QDir::setCurrent(*_run_env[0]);
@@ -1153,6 +1232,14 @@ void Core::display_help(){
 }
 
 
+Render* Core::get_render_of_trace(const Trace* trace) const {
+    for (int i = 0; i < _traces.size(); i++) {
+        if (_traces[i] == trace) return _renders[i];
+    }
+    return nullptr;
+}
+
+
 /***********************************
  *
  *
@@ -1176,8 +1263,8 @@ void Core::information(const string &s) const{
     cerr << s <<endl;
 }
 
-const string Core::get_filename() const{
-    return _file_opened;
+const std::vector<std::string> Core::get_filename() const{
+    return _files_opened;
 }
 
 void Core::set_path_to_export(const string& path){
@@ -1197,7 +1284,7 @@ void Core::set_max_value_for_export(const double d) {
 }
 
 Trace *Core::get_trace() const {
-    return _trace;
+    return _traces[0];
 }
 
 
@@ -1227,5 +1314,5 @@ void Core::export_variable(Variable *var, const string &filename) {
 }
 
 Render_windowed* Core::get_render() const {
-    return _render_windowed;
+    return _renders[0];
 }
diff --git a/src/core/Core.hpp b/src/core/Core.hpp
index 91e3fb7d9b2180c0841c1411658d7260b40d53a6..c1d63b265c824096831ffd7aa63c9cdba6459730 100644
--- a/src/core/Core.hpp
+++ b/src/core/Core.hpp
@@ -232,6 +232,10 @@ class Core : public QObject, public Interface {
 
     static const int _STATE_UPDATE_VARVALUES = 30;
 
+    static const int _STATE_OPEN_NEW_RENDER_AREA = 31;
+
+    static const int _STATE_REMOVE_RENDER_AREA = 32;
+
     /*!
      * \brief Launch an action according to the argument state value.
      * \param state An integer corresponding to a kind of action which must be executed.
@@ -292,7 +296,7 @@ protected:
      * \brief Contains the OpenGL render instance.
      */
     /* MOD */
-    Render_windowed* _render_windowed;
+    std::vector<Render_windowed*> _renders;
 
 #ifdef USE_MPI
     boost::mpi::communicator _world;
@@ -310,7 +314,7 @@ protected:
     /*!
      * \brief Contains the trace instance.
      */
-    Trace* _trace;
+    std::vector<Trace*> _traces;
 
     QMutex*         _mutex;
     Parser*         parser = nullptr;
@@ -323,9 +327,9 @@ protected:
     QString* _run_env[2];
 
     /*!
-     *\brief If a file must be opened, this attribute contains its path.
+     *\brief If files must be opened, this attribute contains their path.
      */
-    std::string _file_opened;
+    std::vector<std::string> _files_opened;
 
     /*!
      *\brief If a container's config file has to be opened, this attribute contains its path.
@@ -406,7 +410,7 @@ public:
      *
      * \return true if no errors occurs.
      */
-    bool draw_trace(const std::string & filename, const int format);
+    bool draw_trace(const std::string & filename, const int format, int index);
 
     /*!
      * \brief This function launch Qt event loop.
@@ -418,7 +422,7 @@ public:
      * \brief Get the name of the current trace file.
      *
      */
-    const std::string get_filename() const override;
+    const std::vector<std::string> get_filename() const override;
 
     /*!
      * \brief Set the name of the output file for SVG export.
@@ -490,6 +494,11 @@ public:
      */
     Render_windowed* get_render() const;
 
+    /*!
+     * \brief Returns the displayed render area which shows the given trace, if it exists, `nullptr` otherwise
+    */
+    Render* get_render_of_trace(const Trace* trace) const;
+
     /*!
      *\brief Export a counter
      * Need to choose a counter, and a filename
diff --git a/src/interface/Interface.hpp b/src/interface/Interface.hpp
index 6fb85e590a64fb62ad016bfffcdc8d9255051526..d9a69d3e32fc8ca0cd4e0cdc21d0b4aa68e947e4 100644
--- a/src/interface/Interface.hpp
+++ b/src/interface/Interface.hpp
@@ -49,6 +49,8 @@
 #ifndef INTERFACE_HPP
 #define INTERFACE_HPP
 
+#include <vector>
+
 
 class Interface;
 
@@ -90,7 +92,7 @@ public:
     /*!
      \brief Return the name of the file opened.
      */
-    virtual const std::string get_filename() const = 0;
+    virtual const std::vector<std::string> get_filename() const = 0;
 };
 
 #endif
diff --git a/src/interface/Interface_graphic.cpp b/src/interface/Interface_graphic.cpp
index f6882ffcf5aeaa15d2b78992562894a44e581cef..41189481381c04b44b0be7f8d993e72c03df0d61 100644
--- a/src/interface/Interface_graphic.cpp
+++ b/src/interface/Interface_graphic.cpp
@@ -95,7 +95,7 @@ using namespace std;
  **********************************/
 
 
-Interface_graphic::Interface_graphic(Core* core, QWidget *parent):QMainWindow(parent){
+Interface_graphic::Interface_graphic(Core* core, QWidget *parent):multirender_window(parent){
 
     setupUi(this);
 
@@ -204,16 +204,12 @@ void Interface_graphic::load_windows(){
     _ui_info_window->setWindowFlags(_ui_info_window->windowFlags() | Qt::WindowStaysOnTopHint);/* Always display info_window on top */
     _ui_time_selection_export->setWindowFlags(_ui_time_selection_export->windowFlags() | Qt::WindowStaysOnTopHint);
 
-    /* Load widget from the .ui file */
-    CKFP(_ui_render_area_layout = this->findChild<QVBoxLayout*>(QStringLiteral("render_area_layout")), "Cannot find the render_area layout in the .ui file");
-
     CKFP(_ui_fullscreen_menu = this->findChild<QAction*>(QStringLiteral("fullscreen")), "Cannot find the fullscreen menu in the .ui file");
     CKFP(_ui_info_trace_text = _ui_info_window->findChild<QTextEdit*>(QStringLiteral("info_trace_text")), "Cannot find the info_trace_text QTextEdit widget in the .ui file");
     CKFP(_ui_info_selection_text = _ui_info_window->findChild<QTextEdit*>(QStringLiteral("info_selection_text")), "Cannot find the info_selection_text QTextEdit widget in the .ui file");
     CKFP(_ui_toolbar = this->findChild<QToolBar*>(QStringLiteral("toolBar")), "Cannot find the tool bar in the .ui file");
 
     CKFP(_ui_x_scroll = this->findChild<QScrollBar*>(QStringLiteral("x_scroll")), "Cannot find the horizontal scroll bar in the .ui file");
-    CKFP(_ui_y_scroll = this->findChild<QScrollBar*>(QStringLiteral("y_scroll")), "Cannot find the vertical scroll bar in the .ui file");
 
     CKFP(_ui_zoom_box = this->findChild<QComboBox*>(QStringLiteral("zoom_box")), "Cannot find the zoom box in the .ui file");
 
@@ -243,7 +239,6 @@ void Interface_graphic::load_windows(){
     QMetaObject::connectSlotsByName(nullptr);
 
     _ui_x_scroll->setMaximum(_REAL_X_SCROLL_LENGTH);
-    _ui_y_scroll->setMaximum(_REAL_Y_SCROLL_LENGTH);
 
     delete loader;
     /* Display the main window */
@@ -313,9 +308,9 @@ void Interface_graphic::opening_file(const string &path){
 
     information(string("File opened: ")+ path);
 
-    _trace_path = path;
+    _traces_path.push_back(path);
 
-    this->setWindowTitle(QStringLiteral("ViTE :: ")+QString::fromStdString(_trace_path));
+    this->setWindowTitle(QStringLiteral("ViTE :: ")+QString::fromStdString(_traces_path.back()));
 
     QApplication::setOverrideCursor(Qt::WaitCursor);
 
@@ -345,7 +340,9 @@ void Interface_graphic::set_scroll_bars_length(Element_pos new_x_virtual_length,
 void Interface_graphic::linking_scroll_bars(Element_pos x_bar_new_value, Element_pos y_bar_new_value){
     _on_manual_change = true;
     _ui_x_scroll->setValue(virtual_to_real_scroll_unit(x_bar_new_value, 'x'));
-    _ui_y_scroll->setValue(virtual_to_real_scroll_unit(y_bar_new_value, 'y'));
+    for (int i = 0; i < _scrolls.size(); i++) {
+        _scrolls[i]->setValue(virtual_to_real_scroll_unit(y_bar_new_value, 'y'));
+    }
     _on_manual_change = false;
 }
 
@@ -425,11 +422,30 @@ void Interface_graphic::on_open_triggered(){
     QString filename = QFileDialog::getOpenFileName(this);
 
     if (!filename.isEmpty()){
-        open_trace(filename);
+        open_trace(filename, 0);
     }/* end if (!filename.isEmpty()) */
 
 }
 
+void Interface_graphic::on_add_trace_triggered(){
+
+    /*
+     Be careful! Here, this is used instead 'this' pointer because 'this' is not a window,
+     it's an interface class (Interface_graphic*). The real window is this.
+     If 'this' is put, the application closes after the getOpenFilename() dialog box closes.
+     */
+    QString filename = QFileDialog::getOpenFileName(this);
+
+    if (!filename.isEmpty()){
+        
+        if (_traces_path.size()>0)
+            open_trace(filename, _renders.size());
+        else {
+            open_trace(filename, 0);
+        }
+    }/* end if (!filename.isEmpty()) */
+}
+
 void Interface_graphic::on_export_file_triggered(){
 
     QStringList selected_files;
@@ -449,7 +465,7 @@ void Interface_graphic::on_export_file_triggered(){
             warning("Cannot restore the export file dialog state");
     }
 
-    file_dialog.setLabelText(QFileDialog::FileName, QString::fromStdString(_trace_path.substr(0, _trace_path.find_last_of('.'))) + QStringLiteral(".svg"));
+    file_dialog.setLabelText(QFileDialog::FileName, QString::fromStdString(_traces_path.back().substr(0, _traces_path.back().find_last_of('.'))) + QStringLiteral(".svg"));
     file_dialog.setFileMode(QFileDialog::AnyFile);/* Allow to browse among directories */
     file_dialog.setAcceptMode(QFileDialog::AcceptSave);/* Only save file */
     file_dialog.setNameFilter(tr("Vector (*.svg);;Bitmap PNG (*.png);;Bitmap JPEG (*.jpeg *.jpg);;Counter (*.txt)"));
@@ -557,6 +573,7 @@ void Interface_graphic::on_export_file_triggered(){
 
 void Interface_graphic::on_reload_triggered() {
     if(_is_rendering_trace) {
+
         Element_pos zoom[2] = { Info::Splitter::_x_min,
                                 Info::Splitter::_x_max };
         if( _ui_settings != nullptr ) {
@@ -566,19 +583,41 @@ void Interface_graphic::on_reload_triggered() {
         //     _ui_node_selection->on_reset_button_clicked();
         // if(_ui_interval_selection!=NULL)
         //  _ui_interval_selection->on_reset_button_clicked();
-        if( _reload_type ) {
+
+        // for the moment: _STATE_CLEAN_RENDER_AREA and multiple traces not compatible
+
+   /*     if( _reload_type ) {
             _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA);
         }
         else {
             _core->launch_action(Core::_STATE_CLEAN_RENDER_AREA);
+        } */
+
+        for (int i=_ui_render_areas.size()-1; i>=0; i--){
+            Render_windowed* render = _ui_render_areas.back();
+
+            if (render != nullptr && i>0)
+                _render_area_layouts[i]->removeWidget(render->get_render_widget());
+
+            _ui_render_areas.pop_back();
+            _ui_render_areas[_ui_render_areas.size()] = nullptr;
+        }
+
+        for (int i=0; i<_traces_path.size(); i++) {
+            _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA);
+            _core->launch_action(Core::_STATE_REMOVE_RENDER_AREA);
+        }
+
+        for (int i=0; i<_traces_path.size(); i++) {
+            if(false==_core->draw_trace(_traces_path[i], Core::_DRAW_OPENGL, i))
+                error("Draw trace failed");
         }
-        _core->draw_trace(_trace_path, Core::_DRAW_OPENGL);
 
         if( Info::Splitter::_x_max != 0.0 ) {
-            _core->launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &zoom);
+            _core->launch_action(Core::_STATE_ZOOM_IN_AN_INTERVAL, &zoom);
         }
 
-        _core->launch_action(Core:: _STATE_RENDER_UPDATE);
+        _core->launch_action(Core::_STATE_RENDER_UPDATE);
 
         //reset the slider to its original value
         scale_container_state->setValue(20);
@@ -587,6 +626,7 @@ void Interface_graphic::on_reload_triggered() {
         if( _ui_interval_selection != nullptr ) {
             _ui_interval_selection->update_values();
         }
+        
     }
 }
 
@@ -608,7 +648,7 @@ void Interface_graphic::on_clear_recent_files_triggered() {
 
 void Interface_graphic::counter_choosed_triggered() {
     // Il faut faire choisir le nom du fichier! et enfin on peut lancer l'action !
-    // const QString path_by_default = QString(_trace_path.substr(0, _trace_path.find_last_of('.')).c_str()) + ".txt";
+    // const QString path_by_default = QString(_traces_path.back().substr(0, _traces_path.back().find_last_of('.')).c_str()) + ".txt";
     //QString filename = QFileDialog::getSaveFileName(this, QObject::tr("Export File"),
     //                                                path_by_default,
     //                                                QObject::tr("All files"));
@@ -629,7 +669,7 @@ void Interface_graphic::option_export_ok_pressed(){
     // We have to save the option from _ui_time_selection_export and hide her if it is not do automatically
 
     _ui_time_selection_export->hide();
-    //   const QString path_by_default = QString(_trace_path.substr(0, _trace_path.find_last_of('.')).c_str()) + ".svg";
+    //   const QString path_by_default = QString(_traces_path.back().substr(0, _traces_path.back().find_last_of('.')).c_str()) + ".svg";
     //QString filename = QFileDialog::getSaveFileName(this, tr("Export File"),
     //                                              path_by_default,
     //                                              tr("Images (*.svg)"));
@@ -645,7 +685,7 @@ void Interface_graphic::option_export_ok_pressed(){
         information(string("Exporting trace to ")+filename.toStdString());
 
         _core->set_path_to_export(filename.toStdString());
-        // _core->draw_trace(_trace_path, Core::_DRAW_SVG);
+        // _core->draw_trace(_traces_path.back(), Core::_DRAW_SVG);
 
         //  if(_ui_CheckBox_time_export->isChecked()){
         //   _core->set_min_value_for_export(convert_to_double(_ui_min_time_export->text().toStdString()));
@@ -670,33 +710,68 @@ void Interface_graphic::on_close_triggered(){
     if(_is_rendering_trace == false)
         return;
 
-    /*
-     * Clear the informative window texts and hide it.
-     */
-    _ui_info_trace_text->clear();/* Clear the current text (if exists) */
-    _ui_info_selection_text->clear();/* Clear the current text (if exists) */
-    _ui_info_window->hide();/* Hide the informative window */
+    // differenciate between closing the only trace or stopping trace comparaison
+    if (_traces_path.size()>1) {
+
+        for (int i=0; i<_ui_render_areas.size()-1; i++){
+            Render_windowed* render = _ui_render_areas.back();
+
+            if (render != nullptr)
+                _render_area_layouts[i]->removeWidget(render->get_render_widget());
+
+            _ui_render_areas.pop_back();
+            _ui_render_areas[_ui_render_areas.size()] = nullptr;
+        }
+
+        for (int i=0; i<_traces_path.size()-1; i++) {
+            _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA);
+            _core->launch_action(Core::_STATE_REMOVE_RENDER_AREA);
+        }
 
-    if(_ui_settings) {
+        while(_traces_path.size()>1){
+            _traces_path.pop_back();
+        }
+        
+    } else {
+
+        /*
+        * Clear the informative window texts and hide it.
+        */
+        _ui_info_trace_text->clear();/* Clear the current text (if exists) */
+        _ui_info_selection_text->clear();/* Clear the current text (if exists) */
+        _ui_info_window->hide();/* Hide the informative window */
+
+        if(_ui_settings) {
         _ui_settings->hide();
-    }
+        }
 
-    if(_plugin_window != nullptr) {
-        _plugin_window->hide();
-        //_plugin_window->clear_plugins();
-    }
+        if(_plugin_window != nullptr) {
+            _plugin_window->hide();
+            //_plugin_window->clear_plugins();
+        }
 
-    _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA);
-    if (_cmd_window){
+        if (_cmd_window){
         delete _cmd_window;
         _cmd_window = nullptr;
-    }
+        }
 
-    _is_rendering_trace = false;
+        for (int i=0; i<_ui_render_areas.size(); i++){
+            Render_windowed* render = _ui_render_areas.back();
+
+            _ui_render_areas.pop_back();
+            _ui_render_areas[_ui_render_areas.size()] = nullptr;
+        }
+
+        _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA);
+        while (!_traces_path.empty())
+            _traces_path.pop_back();
+        
+        _is_rendering_trace = false;
 
-    information(string("File closed."));
+        information(string("File closed."));
 
-    this->setWindowTitle(QStringLiteral("ViTE"));
+        this->setWindowTitle(QStringLiteral("ViTE"));
+    }
 }
 
 
@@ -746,7 +821,7 @@ void Interface_graphic::on_shaded_states_triggered(){
             _core->launch_action(Core::_STATE_RELEASE_RENDER_AREA);
         else
             _core->launch_action(Core::_STATE_CLEAN_RENDER_AREA);
-        _core->draw_trace(_trace_path, Core::_DRAW_OPENGL);
+        _core->draw_trace(_traces_path.back(), Core::_DRAW_OPENGL, 0);
     }
 }
 
@@ -992,10 +1067,11 @@ void Interface_graphic::on_x_scroll_valueChanged(int new_value){
     }
 }
 
-void Interface_graphic::on_y_scroll_valueChanged(int new_value){
+void Interface_graphic::on_y_scroll_valueChanged(int index, int new_value){
     if (!_on_manual_change){
         Element_pos converted_new_value = real_to_virtual_scroll_unit(new_value, 'y');/* change type of new_value */
-        _core->launch_action(Core::_STATE_RENDER_AREA_REPLACE_TRANSLATE_Y, &converted_new_value);
+        void* arg[] = {&index, &converted_new_value};
+        _core->launch_action(Core::_STATE_RENDER_AREA_REPLACE_TRANSLATE_Y, arg);
     }
 }
 
@@ -1026,8 +1102,8 @@ void Interface_graphic::closeEvent(QCloseEvent *event){
         _ui_interval_selection->close();
 }
 
-const std::string Interface_graphic::get_filename() const{
-    return _trace_path;
+const std::vector<std::string> Interface_graphic::get_filename() const{
+    return _traces_path;
 }
 
 Core * Interface_graphic::get_console(){
@@ -1065,6 +1141,27 @@ void Interface_graphic::update_recent_files_menu() {
     }
 }
 
+void Interface_graphic::addRender() {
+    int index = _projectors.size();
+
+    multirender_window::addRender();
+
+    InterfaceEventProjector* proj = new InterfaceEventProjector(this, &Interface_graphic::on_y_scroll_valueChanged, index);
+    _projectors.push_back(proj);
+    QObject::connect(_scrolls[index], &QScrollBar::valueChanged, proj, &InterfaceEventProjector::call);
+}
+
+void Interface_graphic::removeRender() {
+    int index = _projectors.size() - 1;
+    InterfaceEventProjector* proj = _projectors[index];
+
+    QObject::disconnect(_scrolls[index], &QScrollBar::valueChanged, proj, &InterfaceEventProjector::call);
+    _projectors.pop_back();
+    delete proj;
+
+    multirender_window::removeRender();
+}
+
 void Interface_graphic::dragEnterEvent(QDragEnterEvent *event) {
     setBackgroundRole(QPalette::Highlight);
     event->acceptProposedAction();
@@ -1125,35 +1222,11 @@ void Interface_graphic::end_parsing() {
     setDisabled(false); // Enable the main window
 }
 
-void Interface_graphic::open_trace(const QString &filename) {
-
-    // We open the trace
-    if (_is_rendering_trace == true){ /* open a new process */
-
-        QStringList arguments = (QStringList() << filename);
-        QString program;
-        const QString** run_env = _core->get_runenv();
-        QDir::setCurrent(*run_env[0]);
-        QString run_cmd = *run_env[1];
-
-#ifdef VITE_DEBUG
-        cout << __FILE__ << " " << __LINE__ << " : " << run_env[0]->toStdString() << " " << run_env[1]->toStdString() << endl;
-#endif
-
-        if (run_cmd.startsWith(QLatin1String(".")))
-            program = *run_env[0]+(run_cmd.remove(0,1));
-        else
-            program = run_cmd;
-
-        QProcess new_process;
-        new_process.startDetached(program, arguments);
-    }
-    else{
+void Interface_graphic::open_trace(const QString &filename, int index) {
         opening_file(filename.toStdString());
 
-        if(false==_core->draw_trace(filename.toStdString(), Core::_DRAW_OPENGL))
+        if(false==_core->draw_trace(filename.toStdString(), Core::_DRAW_OPENGL, index))
             error("Draw trace failed");
-    }/* end else of if (_is_rendering_trace == true) */
 }
 
 void Interface_graphic::update_settings() {
@@ -1165,3 +1238,14 @@ void Interface_graphic::update_settings() {
 
     _core->launch_action(Core::_STATE_RENDER_UPDATE);
 }
+
+
+InterfaceEventProjector::InterfaceEventProjector(Interface_graphic* object, void (Interface_graphic::*func_pointer)(int, int), int arg1):
+    _object(object),
+    _func_pointer(func_pointer),
+    _arg1(arg1) {}
+
+
+void InterfaceEventProjector::call(int arg2) {
+    (_object->*_func_pointer)(_arg1, arg2);
+}
diff --git a/src/interface/Interface_graphic.hpp b/src/interface/Interface_graphic.hpp
index d28e6b706a2fdf10545366fce8b589c3871ae56c..641b1c5252b9b26ab00654de8cf15b9cef9f2762 100644
--- a/src/interface/Interface_graphic.hpp
+++ b/src/interface/Interface_graphic.hpp
@@ -64,6 +64,7 @@ class QProgressDialog;
 /* -- */
 #include "common/common.hpp"
 #include "common/Session.hpp"
+#include "common/Tools.hpp"
 #include "render/Render.hpp"
 /* -- */
 #include "multirender_window.hpp" /* the main window graphical interface */
@@ -75,10 +76,13 @@ class QProgressDialog;
 #include "interface/Interval_select.hpp"
 
 #include "render/Render_windowed.hpp"
+
+class InterfaceEventProjector;
+
 /*!
  *\brief This class is a graphical interface which creates a window, it inherited from the Interface interface.
  */
-class Interface_graphic : public QMainWindow, public Ui::multirender_window, public Interface {
+class Interface_graphic : public Ui::multirender_window, public Interface {
     Q_OBJECT
     protected:
 
@@ -106,7 +110,7 @@ class Interface_graphic : public QMainWindow, public Ui::multirender_window, pub
     /*!
      *\brief Open the trace of filename. Create a new process if necessary
      */
-    void open_trace(const QString &filename);
+    void open_trace(const QString &filename, int index=0);
 
     /***********************************
      *
@@ -134,11 +138,6 @@ class Interface_graphic : public QMainWindow, public Ui::multirender_window, pub
      */
     QScrollBar* _ui_x_scroll;
 
-    /*!
-     * \brief This variable contains the instance of the vertical scroll bar.
-     */
-    QScrollBar* _ui_y_scroll;
-
     /*!
      *\brief To show the avancement of parsing.
      */
@@ -167,7 +166,12 @@ class Interface_graphic : public QMainWindow, public Ui::multirender_window, pub
     /*!
      * \brief Contains the trace displayed path.
      */
-    std::string _trace_path;
+    std::vector<std::string> _traces_path;
+
+    /*!
+     * \brief Contains the projectors related to the vertical scrollbar events
+     */
+    std::vector<InterfaceEventProjector*> _projectors;
 
     /*!
      * \brief Contains the conversion factor between x virtual and real scroll unit.
@@ -179,16 +183,6 @@ class Interface_graphic : public QMainWindow, public Ui::multirender_window, pub
      */
     double _y_factor_virtual_to_real;
 
-    /*!
-     * \brief Contains the real x scroll bar length.
-     */
-    static const int _REAL_X_SCROLL_LENGTH = 10000;
-
-    /*!
-     * \brief Contains the real x scroll bar length.
-     */
-    static const int _REAL_Y_SCROLL_LENGTH = 10000;
-
     /***********************************
      *
      * Informative window widget attributes.
@@ -480,7 +474,7 @@ public:
      *
      * \return The name of the current trace file
      */
-    const std::string get_filename() const override;
+    const std::vector<std::string> get_filename() const override;
 
     /*!
      * \fn get_console()
@@ -507,6 +501,10 @@ public:
      *
      */
     void update_recent_files_menu();
+    void addRender() override;
+
+
+    void removeRender() override;
 
 public Q_SLOTS:
     /*!
@@ -529,6 +527,11 @@ protected Q_SLOTS:
      */
     void on_open_triggered();
 
+    /*!
+     *\brief A slot called when 'add_trace' in the menu is clicked.
+     */
+    void on_add_trace_triggered();
+
     /*!
      *\brief A slot called when 'export' in the menu is clicked.
      */
@@ -694,9 +697,10 @@ protected Q_SLOTS:
 
     /*!
      * \brief Change the y position of camera view for state drawing area.
+     * \param index the index of the vertical scroll bar
      * \param new_value The new position.
      */
-    void on_y_scroll_valueChanged(int new_value);/* temporary slot */
+    void on_y_scroll_valueChanged(int index, int new_value);/* temporary slot */
 
     /*!
      * \brief Change the percentage taken by container display in the render area.
@@ -710,4 +714,21 @@ protected Q_SLOTS:
 
 };
 
+
+class InterfaceEventProjector : public QObject {
+  Q_OBJECT
+
+  Interface_graphic* _object;
+  void (Interface_graphic::*_func_pointer)(int, int);
+  int _arg1;
+
+public:
+
+  InterfaceEventProjector(Interface_graphic* object, void (Interface_graphic::*func_pointer)(int, int), int arg1);
+
+  void call(int arg2);
+
+};
+
+
 #endif
diff --git a/src/interface/Interval_select.cpp b/src/interface/Interval_select.cpp
index 0369e596e882874b0178f7bdd833ea6fde321e24..c5c23d68fc6d5a0374e1cc6eb3babcdf4bfcb85f 100644
--- a/src/interface/Interval_select.cpp
+++ b/src/interface/Interval_select.cpp
@@ -102,21 +102,22 @@ Trace* Interval_select::get_trace() {
 void Interval_select::set_trace(Trace *trace) {
     // Initialize _trace
     _trace = trace;
+    Render* render = _console->get_console()->get_render_of_trace(_trace);
 
-    min_value->setText(QString().setNum (Info::Entity::x_min));
-    max_value->setText(QString().setNum (Info::Entity::x_max));
+    min_value->setText(QString().setNum (render->entities_x_min));
+    max_value->setText(QString().setNum (render->entities_x_max));
 
-    minSpinBox->setMinimum(Info::Entity::x_min);
-    minSpinBox->setMaximum(Info::Entity::x_max);
-    maxSpinBox->setMinimum(Info::Entity::x_min);
-    maxSpinBox->setMaximum(Info::Entity::x_max);
+    minSpinBox->setMinimum(render->entities_x_min);
+    minSpinBox->setMaximum(render->entities_x_max);
+    maxSpinBox->setMinimum(render->entities_x_min);
+    maxSpinBox->setMaximum(render->entities_x_max);
 
     //the slider stays in int, we will translate its values
     /*interval_slider->setMinimum(0);
      interval_slider->setMaximum(99);*/
 
-    double delta=Info::Entity::x_max - Info::Entity::x_min;
-    double step= 0.001 * delta; //make steps of .1% for spinboxes
+    double delta = render->entities_x_max - render->entities_x_min;
+    double step = 0.001 * delta; //make steps of .1% for spinboxes
     minSpinBox->setSingleStep(step);
     maxSpinBox->setSingleStep(step);
 
@@ -131,21 +132,23 @@ void Interval_select::update_values() {
         Element_pos _min;
         Element_pos _max;
 
+        Render* render = _console->get_console()->get_render_of_trace(_trace);
+
         //choose which value to load the actual position from (can change if we are loading from a splitted file set)
         if(Info::Splitter::preview == true){
-            _min = Info::Entity::x_min;
-            _max = Info::Entity::x_max;
+            _min = render->entities_x_min;
+            _max = render->entities_x_max;
         }
         else if(Info::Splitter::load_splitted == true) {
-            Info::Render::_x_min = Info::Splitter::_x_min;
-            Info::Render::_x_max = Info::Splitter::_x_max;
+            render->_x_min = Info::Splitter::_x_min;
+            render->_x_max = Info::Splitter::_x_max;
             auto_refresh_box->setChecked(false);//set the checkbox to false because reload is expensive for splitted mode
             _min = Info::Splitter::_x_min;
             _max = Info::Splitter::_x_max;
         }
         else {
-            _min = Info::Render::_x_min;
-            _max = Info::Render::_x_max;
+            _min = render->_x_min;
+            _max = render->_x_max;
         }
         bool v  = minSpinBox->blockSignals(true);
         bool v2 = maxSpinBox->blockSignals(true);
@@ -257,8 +260,6 @@ void Interval_select::maxSliderValueChanged( int _value )
         if(_auto_refresh)apply_settings();
     }
     _applied = false;
-
-    std::cerr << "maxvalue changed" << std::endl;
 }
 
 
@@ -280,7 +281,7 @@ void Interval_select::apply_settings(){
             _trace->updateTrace(new Interval(zoom[0], zoom[1]));
 #endif
 
-            _console->get_console()->draw_trace(_console->get_filename(),Core::_DRAW_OPENGL);
+            _console->get_console()->draw_trace(_console->get_filename()[0].c_str(), Core::_DRAW_OPENGL, 0);
 
             _console->get_console()->launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &zoom);
             _console->get_console()->launch_action(Core:: _STATE_RENDER_UPDATE);
diff --git a/src/interface/Node_select.cpp b/src/interface/Node_select.cpp
index a7caaf98fc195c617e4c724bd983009086c45632..2a59fe777368073d9aa504f1aa106d8c4d32248b 100644
--- a/src/interface/Node_select.cpp
+++ b/src/interface/Node_select.cpp
@@ -265,16 +265,15 @@ void Node_select::on_reset_button_clicked(){
     _nodes_displayed->clear();
     //can we load that from _nodes_original instead ?
     set_displayed_container_names();
-    Element_pos zoom[2]={Info::Render::_x_min, Info::Render::_x_max};
-    Info::Render::_x_min_visible = 0.0;
-    Info::Render::_x_max_visible = 0.0;
+    Render* render = _console->get_console()->get_render_of_trace(_trace);
+    Element_pos zoom[2]={render->_x_min, render->_x_max};
     _trace->set_view_root_containers(_displayed_containers);
     //_trace->set_selected_container(_trace->get_root_containers());
     _console->get_console()->launch_action(Core:: _STATE_CLEAN_RENDER_AREA);
 #if defined(USE_ITC) && defined(BOOST_SERIALIZE)
     _trace->updateTrace(new Interval(zoom[0], zoom[1]));
 #endif
-    _console->get_console()->draw_trace(_console->get_filename(),Core::_DRAW_OPENGL);
+    _console->get_console()->draw_trace(_console->get_filename().back(), Core::_DRAW_OPENGL, 0);
     _console->get_console()->launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &zoom);
     _console->get_console()->launch_action(Core:: _STATE_RENDER_UPDATE);
 }
@@ -330,14 +329,15 @@ void Node_select::on_display_button_clicked(){
     _displayed_containers.clear();
     build_displayed_nodes(_displayed_containers);
     _trace->set_view_root_containers(_displayed_containers);
-    Element_pos it[2]={Info::Render::_x_min, Info::Render::_x_max};
+    Render* render = _console->get_console()->get_render_of_trace(_trace);
+    Element_pos it[2]={render->_x_min, render->_x_max};
     //Info::Render::_x_min_visible = 0.0;
     //Info::Render::_x_max_visible = 0.0;
     _console->get_console()->launch_action(Core:: _STATE_CLEAN_RENDER_AREA);
     #if defined(USE_ITC) && defined(BOOST_SERIALIZE)
     _trace->updateTrace(new Interval(it[0], it[1]));
     #endif
-    _console->get_console()->draw_trace(_console->get_filename(),Core::_DRAW_OPENGL);
+    _console->get_console()->draw_trace(_console->get_filename()[0], Core::_DRAW_OPENGL, 0);
 
     _console->get_console()->launch_action(Core:: _STATE_ZOOM_IN_AN_INTERVAL, &it);
     _console->get_console()->launch_action(Core:: _STATE_RENDER_UPDATE);
diff --git a/src/interface/multirender_window.cpp b/src/interface/multirender_window.cpp
index 36dc9f5b5755b14b826eea72b824404909d4f4c6..cfdb68ed6b4ec1175f863804088e5ffa7d559530 100644
--- a/src/interface/multirender_window.cpp
+++ b/src/interface/multirender_window.cpp
@@ -10,6 +10,9 @@ std::string concatenate(const char* name, int index) {
 }
 
 
+multirender_window::multirender_window(QWidget* parent):QMainWindow(parent) {}
+
+
 void multirender_window::setupUi(QMainWindow *main_window) {
     Ui_default_window::setupUi(main_window);
     this->addRender();
@@ -33,6 +36,7 @@ void multirender_window::addRender() {
     _scrolls.push_back(y_scroll);
     y_scroll->setObjectName(QString::fromUtf8(concatenate("y_scroll", index).c_str()));
     y_scroll->setOrientation(Qt::Vertical);
+    y_scroll->setMaximum(_REAL_Y_SCROLL_LENGTH);
 
     render->addWidget(y_scroll);
 
@@ -46,17 +50,25 @@ void multirender_window::removeRender() {
     QHBoxLayout* render = _renders.back();
     _renders.pop_back();
 
-    QVBoxLayout* render_area_layout = _render_area_layouts.back();
-    _render_area_layouts.pop_back();
-    render->removeItem(render_area_layout);
-    delete render_area_layout;
-
     QScrollBar* y_scroll = _scrolls.back();
     _scrolls.pop_back();
 
     render->removeWidget(y_scroll);
     delete y_scroll;
+    _scrolls[_scrolls.size()] = nullptr;
+
+    QVBoxLayout* render_area_layout = _render_area_layouts.back();
+    _render_area_layouts.pop_back();
+    render->removeItem(render_area_layout);
+    delete render_area_layout;
+    _render_area_layouts[_render_area_layouts.size()] = nullptr;
 
     render_areas->removeItem(render);
     delete render;
+    _renders[_renders.size()] = nullptr;
+}
+
+
+int multirender_window::numberOfRenders() {
+    return _renders.size();
 }
\ No newline at end of file
diff --git a/src/interface/multirender_window.hpp b/src/interface/multirender_window.hpp
index 448e8e79214c72458639eca45f632eb1f4adb14a..877b8e11e6451f8ca575c1d0d0b95087294376c4 100644
--- a/src/interface/multirender_window.hpp
+++ b/src/interface/multirender_window.hpp
@@ -3,30 +3,53 @@
 
 namespace Ui {
 
-    class multirender_window: protected Ui_default_window {
+    class multirender_window: public QMainWindow, protected Ui_default_window {
     
     protected:
         std::vector<QHBoxLayout*> _renders;
         std::vector<QVBoxLayout*> _render_area_layouts;
         std::vector<QScrollBar*> _scrolls;
 
+        /*!
+        * \brief Contains the real x scroll bar length.
+        */
+        static const int _REAL_X_SCROLL_LENGTH = 10000;
+
+        /*!
+        * \brief Contains the real x scroll bar length.
+        */
+        static const int _REAL_Y_SCROLL_LENGTH = 10000;
+
     public:
 
+        /*!
+        * \brief The default constructor
+        * \param parent The parent widget of the graphical interface. Should be ignored.
+        */
+        multirender_window(QWidget* parent = nullptr);
+
         /*!
          * \brief Sets up the displayed elements on the window
          * \param main_window The window which is to setup (equal to `this`)
          */
-        void setupUi(QMainWindow *main_window);
+        virtual void setupUi(QMainWindow *main_window);
 
         /*!
          * \brief This method adds a new empty render area to be displayed on the window
          */
-        void addRender();
+        virtual void addRender();
 
         /*!
          * \brief Removes the last (lower) render area of the window
          */
-        void removeRender();
+        virtual void removeRender();
+
+        /*!
+         * \brief Returns the number of renders area available on the screen
+         * 
+         * \return int
+         */
+        virtual int numberOfRenders();
 
     };
 }
\ No newline at end of file
diff --git a/src/plugin/Command_window.cpp b/src/plugin/Command_window.cpp
index f8321598e173f4c98d5fa8e8a7445590e7976d45..4c2ce9a56531254d218c80f1c4f3aab64451a385 100644
--- a/src/plugin/Command_window.cpp
+++ b/src/plugin/Command_window.cpp
@@ -159,7 +159,7 @@ void Command_window::on_execute_button_clicked(){
     _trace->set_filter(filter.toDouble());
 
     _console->get_console()->launch_action(Core::_STATE_RENDER_UPDATE);
-    _console->get_console()->draw_trace(_console->get_filename(),Core::_DRAW_OPENGL);
+    _console->get_console()->draw_trace(_console->get_filename().back(), Core::_DRAW_OPENGL, 0);
 
 
 }
diff --git a/src/render/GanttDiagram.hpp b/src/render/GanttDiagram.hpp
index b60dd70355ffc3b995c07e5fcc3b04a6d3b4d7d3..94e1e6c16f52cca9fc3e22d047182f28eadd77c5 100644
--- a/src/render/GanttDiagram.hpp
+++ b/src/render/GanttDiagram.hpp
@@ -112,7 +112,7 @@ public:
     /*!
      * \brief The default constructor
      */
-    GanttDiagram( Render *instance ) {
+    GanttDiagram( Render *instance ) : Geometry(instance) {
         _render = instance;
         _start_new_line = false;
     }
@@ -273,7 +273,7 @@ public:
                            EntityValue * value)
         {
             _render->set_color(r, g, b);
-            _render->draw_state(trace_to_render_x(start - Info::Render::_x_min_visible),
+            _render->draw_state(trace_to_render_x(start - _render->_x_min_visible),
                                 trace_to_render_y(base),
                                 _z_state,
                                 (end-start)*coeff_trace_render_x(),
@@ -317,8 +317,8 @@ public:
         {
             _render->set_color(r, g, b);
 
-            start_time   = trace_to_render_x(start_time - Info::Render::_x_min_visible);
-            end_time     = trace_to_render_x(end_time   - Info::Render::_x_min_visible);
+            start_time   = trace_to_render_x(start_time - _render->_x_min_visible);
+            end_time     = trace_to_render_x(end_time   - _render->_x_min_visible);
             start_height = trace_to_render_y(start_height);
             end_height   = trace_to_render_y(end_height);
 
@@ -358,7 +358,7 @@ public:
             /* For SVG */
             _render->set_color(r, g, b);
 
-            time             = trace_to_render_x(time - Info::Render::_x_min_visible);
+            time             = trace_to_render_x(time - _render->_x_min_visible);
             height           = trace_to_render_y(height);
             container_height = container_height*coeff_trace_render_y();
 
@@ -414,7 +414,7 @@ public:
             {/* line is already started */
 
                 if (x <= 0.0){/* convention: the line is over */
-                    _render->draw_line( trace_to_render_x(_counter_last_x - Info::Render::_x_min_visible),
+                    _render->draw_line( trace_to_render_x(_counter_last_x - _render->_x_min_visible),
                                         trace_to_render_y(_counter_last_y),
                                         trace_to_render_x(Info::Entity::x_max),
                                         trace_to_render_y(_counter_last_y),
@@ -426,14 +426,14 @@ public:
 
                     /* Each time, the method draw the line from the previous point to
                      the current point (x, y). This last is stored for the next line drawing. */
-                    _render->draw_line( trace_to_render_x(_counter_last_x - Info::Render::_x_min_visible),
+                    _render->draw_line( trace_to_render_x(_counter_last_x - _render->_x_min_visible),
                                         trace_to_render_y(_counter_last_y),
-                                        trace_to_render_x(x - Info::Render::_x_min_visible),
+                                        trace_to_render_x(x - _render->_x_min_visible),
                                         trace_to_render_y(_counter_last_y),
                                         _z_counter );
-                    _render->draw_line( trace_to_render_x(x - Info::Render::_x_min_visible),
+                    _render->draw_line( trace_to_render_x(x - _render->_x_min_visible),
                                         trace_to_render_y(_counter_last_y),
-                                        trace_to_render_x(x - Info::Render::_x_min_visible),
+                                        trace_to_render_x(x - _render->_x_min_visible),
                                         trace_to_render_y(y),
                                         _z_counter );
                     _counter_last_x = x;
@@ -449,7 +449,7 @@ public:
         {
             if (!_start_new_line) {/* If a line was previously opened */
                 /* Draw the last line */
-                _render->draw_line( trace_to_render_x(_counter_last_x - Info::Render::_x_min_visible),
+                _render->draw_line( trace_to_render_x(_counter_last_x - _render->_x_min_visible),
                                     trace_to_render_y(_counter_last_y),
                                     trace_to_render_x(Info::Entity::x_max),
                                     trace_to_render_y(_counter_last_y),
diff --git a/src/render/Geometry.cpp b/src/render/Geometry.cpp
index 4b92efb642bf89bac423bbfef93d352617ec8d5a..00915a21494a8c77b05ab4a8f25f5247478cfd41 100644
--- a/src/render/Geometry.cpp
+++ b/src/render/Geometry.cpp
@@ -67,7 +67,7 @@ using namespace std;
  *
  **********************************/
 
-Geometry::Geometry(){
+Geometry::Geometry(Render* render) : _render(render) {
 
     init_geometry();
 
@@ -189,7 +189,7 @@ Element_pos Geometry::coeff_screen_render_y() const {
 
 Element_pos Geometry::coeff_trace_render_x() const {
 
-    return ((Info::Render::width-_default_entity_x_translate)*_x_state_scale) / (Info::Entity::x_max - Info::Entity::x_min);
+    return ((Info::Render::width-_default_entity_x_translate)*_x_state_scale) / (_render->entities_x_max - _render->entities_x_min);
 }
 
 Element_pos Geometry::coeff_trace_render_y() const {
@@ -200,8 +200,8 @@ Element_pos Geometry::coeff_trace_render_y() const {
 
 
 void Geometry::update_visible_interval_value() const {
-    Info::Render::_x_min_visible = max(Info::Entity::x_min, (_x_state_translate - _default_entity_x_translate                      )/coeff_trace_render_x());
-    Info::Render::_x_min=max(Info::Entity::x_min, _x_state_translate/coeff_trace_render_x());
-    Info::Render::_x_max=min(Info::Entity::x_max, (_x_state_translate- _default_entity_x_translate + Info::Render::width)/coeff_trace_render_x());
-    Info::Render::_x_max_visible = min(Info::Entity::x_max, (_x_state_translate - _default_entity_x_translate + Info::Render::width)/coeff_trace_render_x());
+    _render->_x_min_visible = max(_render->entities_x_min, (_x_state_translate - _default_entity_x_translate                      )/coeff_trace_render_x());
+    _render->_x_min = max(_render->entities_x_min, _x_state_translate/coeff_trace_render_x());
+    _render->_x_max = min(_render->entities_x_max, (_x_state_translate- _default_entity_x_translate + Info::Render::width)/coeff_trace_render_x());
+    _render->_x_max_visible = min(_render->entities_x_max, (_x_state_translate - _default_entity_x_translate + Info::Render::width)/coeff_trace_render_x());
 }
diff --git a/src/render/Geometry.hpp b/src/render/Geometry.hpp
index d3754c485154d0d1da376ab5c2ad730a6f3b51e8..aac6929867ca48dd93e3178730c66dd6d5bc5d79 100644
--- a/src/render/Geometry.hpp
+++ b/src/render/Geometry.hpp
@@ -48,6 +48,8 @@
 #ifndef GEOMETRY_HPP
 #define GEOMETRY_HPP
 
+#include "render/Render.hpp"
+
 /*!
  * \brief This class provide some tools to manage the window and render area geometry.
  */
@@ -56,6 +58,11 @@ class Geometry
 
 protected:
 
+    /*!
+     * \brief The render area on which the geometry is based
+     */
+    Render* _render;
+
     /*!
      * \brief The last x position of the point (for counter).
      */
@@ -237,8 +244,9 @@ public:
 
     /*!
      * \brief The constructor.
+     * \param render the render area on which the geometry is based
      */
-    Geometry();
+    Geometry(Render* render);
 
     /*!
      * \brief The destructor
diff --git a/src/render/Render.hpp b/src/render/Render.hpp
index 6408cf0d6e71445948b642ef4c3ad3d9bf79be09..f123b2207a7c86de918ac8be0411adf76161213a 100644
--- a/src/render/Render.hpp
+++ b/src/render/Render.hpp
@@ -117,6 +117,36 @@ class Render
 
 public:
 
+    /*!
+    * \brief Contains the trace maximum visible time.
+    */
+    Element_pos _x_max = 0.0;
+
+    /*!
+    * \brief Contains the trace minimum visible time, uncorrected (state width isn't removed)
+    */
+    Element_pos _x_min = 0.0;
+
+    /*!
+    * \brief Contains the trace minimum visible time.
+    */
+    Element_pos _x_min_visible = 0.0;
+
+    /*!
+    * \brief Contains the trace maximum visible time.
+    */
+    Element_pos _x_max_visible = 0.0;
+
+    /*!
+    * \brief Contains the trace minimum states time.
+    */
+    Element_pos entities_x_min = 0.0;
+
+    /*!
+    * \brief Contains the trace maximum states time.
+    */
+    Element_pos entities_x_max = 0.0;
+
     virtual ~Render() = default;
 
     /*!
diff --git a/src/render/Render_abstract.cpp b/src/render/Render_abstract.cpp
index 766159d53d87cb3d0d5010274c5c0c1f358f8b0e..b238f43c25d91ae05c3c3d17b08f06ac207b712e 100644
--- a/src/render/Render_abstract.cpp
+++ b/src/render/Render_abstract.cpp
@@ -79,7 +79,7 @@ static const int scroll_margin = 100;/* Control the margin of the trace. Must be
  **********************************/
 
 Render_abstract::Render_abstract(Core *core)
-        : _core(core) {
+        : Geometry(this), _core(core) {
 
     /* init main informations about the scene and the widget size */
 
@@ -178,7 +178,7 @@ void Render_abstract::apply_zoom_box(Element_pos x_min, Element_pos x_max, Eleme
     /* Now, check if zoom is not too much */
     update_visible_interval_value();
 
-    delta = Info::Render::_x_max_visible - Info::Render::_x_min_visible;
+    delta = _x_max_visible - _x_min_visible;
 
     if (delta <= zoom_limit) {/* if too much, cancel */
 
@@ -190,8 +190,8 @@ void Render_abstract::apply_zoom_box(Element_pos x_min, Element_pos x_max, Eleme
 #if defined(USE_ITC) && defined(BOOST_SERIALIZE)
     if(Info::Splitter::preview==true && Info::Render::_key_ctrl == true){
         //we are in preview mode, we have to load the actual data from the serialized files
-        Info::Splitter::_x_min= Info::Render::_x_min_visible;
-        Info::Splitter::_x_max= Info::Render::_x_max_visible;
+        Info::Splitter::_x_min= _x_min_visible;
+        Info::Splitter::_x_max= _x_max_visible;
       //  Info::Splitter::preview=false;
         _core->launch_action(_core->_LOAD_DATA, NULL);
         Info::Render::_key_ctrl =false;
diff --git a/src/render/Render_svg.cpp b/src/render/Render_svg.cpp
index 9dba3185b317f715d1a288e3eeb907e6696f253f..ef56709c4e60c5d2a58f086e7779d8eb05a2c181 100644
--- a/src/render/Render_svg.cpp
+++ b/src/render/Render_svg.cpp
@@ -80,7 +80,7 @@ using namespace std;
  *
  **********************************/
 
-Render_svg::Render_svg(string* output_filename){
+Render_svg::Render_svg(string* output_filename) : Geometry(this) {
 
     _output_file.open(output_filename->c_str(), ofstream::out | ofstream::trunc);
 
@@ -93,7 +93,7 @@ Render_svg::Render_svg(string* output_filename){
 }
 
 
-Render_svg::~Render_svg(){
+Render_svg::~Render_svg() {
 
    if (_output_file.is_open())
        _output_file.close();
@@ -296,8 +296,8 @@ void Render_svg::end_ruler(){
     Element_pos coeff_prefix;
 
 
-    graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
-    coeff_prefix    = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
+    graduation_diff = Ruler::get_graduation_diff(_x_min_visible, _x_max_visible);
+    coeff_prefix    = Ruler::get_coeff_for_common_prefix(_x_min_visible, _x_max_visible);
 
     _buffer.str("");/* flush the buffer */
 
@@ -305,22 +305,22 @@ void Render_svg::end_ruler(){
             << " y=\""      << render_to_screen_y(3) << "\""
             << " font-size=\"" << 14 << "\""
             << " fill=\"white\">"
-            << "min: " << (double)Info::Render::_x_min_visible
+            << "min: " << (double)_x_min_visible
             << "</text>\n";
 
-    _buffer << "<text x=\"" << render_to_screen_x(trace_to_render_x(Info::Render::_x_max_visible))- render_to_screen_x(trace_to_render_x(Info::Render::_x_min_visible)) <<"\""
+    _buffer << "<text x=\"" << render_to_screen_x(trace_to_render_x(_x_max_visible))- render_to_screen_x(trace_to_render_x(_x_min_visible)) <<"\""
             << " y=\""      << render_to_screen_y(3) << "\""
             << " font-size=\"" << 14 << "\""
             << " fill=\"white\">"
-            << "max: " << (double)Info::Render::_x_max_visible
+            << "max: " << (double)_x_max_visible
             << "</text>\n";
 
 
-    for (Element_pos i = Info::Render::_x_min_visible ;
-         i < Info::Render::_x_max_visible ;
+    for (Element_pos i = _x_min_visible ;
+         i < _x_max_visible ;
          i+=graduation_diff){
 
-        _buffer << "<text x=\"" << render_to_screen_x(trace_to_render_x(i - Info::Render::_x_min_visible)+1) <<"\""
+        _buffer << "<text x=\"" << render_to_screen_x(trace_to_render_x(i - _x_min_visible)+1) <<"\""
                 << " y=\""      << render_to_screen_y(8) << "\""
                 << " font-size=\"" << 10 << "\""
                 << " fill=\"white\">"
diff --git a/src/render/opengl/Render_opengl.cpp b/src/render/opengl/Render_opengl.cpp
index ce012917cea318ce74470f8e359b898f9e165cae..5077903a5b2fa9ee001ad9b5affdf8c859d6dcae 100644
--- a/src/render/opengl/Render_opengl.cpp
+++ b/src/render/opengl/Render_opengl.cpp
@@ -434,42 +434,42 @@ void  Render_opengl::paintGL(){
     std::ostringstream buf_txt;
     Element_pos graduation_diff;
     Element_pos coeff_prefix;
-    graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
-    coeff_prefix    = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
+    graduation_diff = Ruler::get_graduation_diff(_x_min_visible, _x_max_visible);
+    coeff_prefix    = Ruler::get_coeff_for_common_prefix(_x_min_visible, _x_max_visible);
 
     arial_font.setPointSize(14);
 
     buf_txt.str("");/* flush the buffer */
-    buf_txt << "min: " << (double)Info::Render::_x_min_visible;
+    buf_txt << "min: " << (double)_x_min_visible;
 
-    renderText (render_to_screen_x(trace_to_render_x(Info::Render::_x_min_visible)),
+    renderText (render_to_screen_x(trace_to_render_x(_x_min_visible)),
                 render_to_screen_y(3),
                 QString::fromStdString(buf_txt.str()),
                 arial_font);
 
     buf_txt.str("");/* flush the buffer */
-    buf_txt << "max: " << (double)Info::Render::_x_max_visible;
+    buf_txt << "max: " << (double)_x_max_visible;
 
-    renderText (render_to_screen_x(trace_to_render_x(Info::Render::_x_max_visible))-130,
+    renderText (render_to_screen_x(trace_to_render_x(_x_max_visible))-130,
                 render_to_screen_y(3),
                 QString::fromStdString(buf_txt.str()),
                 arial_font);
 
     buf_txt.str("");
-    buf_txt << Ruler::get_common_part_string(Info::Render::_x_min_visible, coeff_prefix) << "--";
+    buf_txt << Ruler::get_common_part_string(_x_min_visible, coeff_prefix) << "--";
 
     renderText (render_to_screen_x(
                     trace_to_render_x(
-                        (Info::Render::_x_min_visible +
-                         Info::Render::_x_max_visible) / 2)),
+                        (_x_min_visible +
+                         _x_max_visible) / 2)),
                 render_to_screen_y(3),
                 QString::fromStdString(buf_txt.str()),
                 arial_font);
 
     arial_font.setPointSize(10);
 
-    for (Element_pos i = Info::Render::_x_min_visible ;
-         i < Info::Render::_x_max_visible ;
+    for (Element_pos i = _x_min_visible ;
+         i < _x_max_visible ;
          i+=graduation_diff){
 
         buf_txt.str("");/* flush the buffer */
@@ -697,26 +697,26 @@ void Render_opengl::call_ruler(){
 
     update_visible_interval_value();
 
-    graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
+    graduation_diff = Ruler::get_graduation_diff(_x_min_visible, _x_max_visible);
     // coeff_prefix    = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
 
     set_color(1.0, 1.0, 1.0);
 
-    for (Element_pos i = Info::Render::_x_min_visible ;
-         i < Info::Render::_x_max_visible ;
+    for (Element_pos i = _x_min_visible ;
+         i < _x_max_visible ;
          i+=graduation_diff){
 
         const Element_pos grad_div_by_5 = graduation_diff/5;
         for (Element_pos j = (i+grad_div_by_5) ; j<(i+graduation_diff) ; j+= grad_div_by_5){
 
-            if (j>=Info::Render::_x_max_visible)
+            if (j>=_x_max_visible)
                 break;
 
             draw_line( trace_to_render_x(j) + offset_x, offset_y ,
                        trace_to_render_x(j) + offset_x, 2+offset_y, _z_ruler);
         }
 
-        if (i>=Info::Render::_x_max_visible)
+        if (i>=_x_max_visible)
             break;
 
         draw_line( trace_to_render_x(i) + offset_x, offset_y-1 ,
@@ -726,20 +726,20 @@ void Render_opengl::call_ruler(){
     glBegin(GL_QUADS);
     {
         glColor4f(0.0f, 0.0f, 1.0f, 0.8f);
-        glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 3, _z_ruler_under );
-        glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 8, _z_ruler_under );
-        glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 8, _z_ruler_under );
-        glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 3, _z_ruler_under );
+        glVertex3d(trace_to_render_x(_x_min_visible), 3, _z_ruler_under );
+        glVertex3d(trace_to_render_x(_x_min_visible), 8, _z_ruler_under );
+        glVertex3d(trace_to_render_x(_x_max_visible), 8, _z_ruler_under );
+        glVertex3d(trace_to_render_x(_x_max_visible), 3, _z_ruler_under );
     }
     glEnd();
 
     glBegin(GL_QUADS);
     {
         glColor4f(0.0, 0.0, 0.0, 1.0);
-        glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 0, _z_ruler_over );
-        glVertex3d(trace_to_render_x(Info::Render::_x_min_visible), 3, _z_ruler_over );
-        glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 3, _z_ruler_over );
-        glVertex3d(trace_to_render_x(Info::Render::_x_max_visible), 0, _z_ruler_over );
+        glVertex3d(trace_to_render_x(_x_min_visible), 0, _z_ruler_over );
+        glVertex3d(trace_to_render_x(_x_min_visible), 3, _z_ruler_over );
+        glVertex3d(trace_to_render_x(_x_max_visible), 3, _z_ruler_over );
+        glVertex3d(trace_to_render_x(_x_max_visible), 0, _z_ruler_over );
     }
     glEnd();
 
diff --git a/src/render/vbo/Render_alternate.cpp b/src/render/vbo/Render_alternate.cpp
index 4625e5e48146570d14a7108d355142e97804c121..56cbd0fca6b2f4e135dc737adcff3e5ae3e64c02 100644
--- a/src/render/vbo/Render_alternate.cpp
+++ b/src/render/vbo/Render_alternate.cpp
@@ -99,6 +99,7 @@ extern "C" {
     }
 #endif
 }
+
 #define message *Message::get_instance() << "(" << __FILE__ << " l." << __LINE__ << "): "
 
 static bool _draw_container;
@@ -649,33 +650,33 @@ void  Render_alternate::paintGL(){
     Element_pos graduation_diff;
     Element_pos ruler_duration;
     Element_pos coeff_prefix;
-    graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
-    ruler_duration  = Ruler::get_ruler_duration(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
-    coeff_prefix    = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
+    graduation_diff = Ruler::get_graduation_diff(_x_min_visible, _x_max_visible);
+    ruler_duration  = Ruler::get_ruler_duration(_x_min_visible, _x_max_visible);
+    coeff_prefix    = Ruler::get_coeff_for_common_prefix(_x_min_visible, _x_max_visible);
 
     arial_font.setPointSize(14);
 
     buf_txt.str("");/* flush the buffer */
-    buf_txt << "min: " << (double)Info::Render::_x_min_visible;
+    buf_txt << "min: " << (double)_x_min_visible;
 
-    renderText (render_to_screen_x(trace_to_render_x(Info::Render::_x_min_visible)),
+    renderText (render_to_screen_x(trace_to_render_x(_x_min_visible)),
                 render_to_screen_y(3),
                 QString::fromStdString(buf_txt.str()),
                 arial_font);
 
     buf_txt.str("");/* flush the buffer */
-    buf_txt << "max: " << (double)Info::Render::_x_max_visible;
+    buf_txt << "max: " << (double)_x_max_visible;
 
-    renderText (render_to_screen_x(trace_to_render_x(Info::Render::_x_max_visible))-130,
+    renderText (render_to_screen_x(trace_to_render_x(_x_max_visible))-130,
                 render_to_screen_y(3),
                 QString::fromStdString(buf_txt.str()),
                 arial_font);
 
     buf_txt.str("");
-    buf_txt << Ruler::get_common_part_string(Info::Render::_x_min_visible, coeff_prefix) << "-- ";
+    buf_txt << Ruler::get_common_part_string(_x_min_visible, coeff_prefix) << "-- ";
 
-    renderText(render_to_screen_x(trace_to_render_x((Info::Render::_x_min_visible +
-                                                     Info::Render::_x_max_visible) / 2)),
+    renderText(render_to_screen_x(trace_to_render_x((_x_min_visible +
+                                                     _x_max_visible) / 2)),
                render_to_screen_y(3),
                QString::fromStdString(buf_txt.str()),
                arial_font);
@@ -684,14 +685,14 @@ void  Render_alternate::paintGL(){
     buf_txt.str("");
     buf_txt << Ruler::get_ruler_duration_string(ruler_duration);
 
-    renderText(render_to_screen_x(trace_to_render_x((3*Info::Render::_x_min_visible +
-                                                     Info::Render::_x_max_visible) / 4)),
+    renderText(render_to_screen_x(trace_to_render_x((3*_x_min_visible +
+                                                     _x_max_visible) / 4)),
                render_to_screen_y(3),
                QString::fromStdString(buf_txt.str()),
                arial_font);
 
-    for (Element_pos i = Info::Render::_x_min_visible ;
-         i < Info::Render::_x_max_visible ;
+    for (Element_pos i = _x_min_visible ;
+         i < _x_max_visible ;
          i+=graduation_diff){
 
         buf_txt.str("");/* flush the buffer */
@@ -866,28 +867,28 @@ void Render_alternate::call_ruler(){
 
     update_visible_interval_value();
 
-    graduation_diff = Ruler::get_graduation_diff(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
+    graduation_diff = Ruler::get_graduation_diff(_x_min_visible, _x_max_visible);
     //coeff_prefix    = Ruler::get_coeff_for_common_prefix(Info::Render::_x_min_visible, Info::Render::_x_max_visible);
     //draw quads
     set_color(0.0, 0.0, 1.0);
-    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 3, _r, _g, _b);
-    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 8, _r, _g, _b);
-    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 8, _r, _g, _b);
-    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 8, _r, _g, _b);
-    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 3, _r, _g, _b);
-    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 3, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_min_visible), 3, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_min_visible), 8, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_max_visible), 8, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_max_visible), 8, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_max_visible), 3, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_min_visible), 3, _r, _g, _b);
     set_color(0.0, 0.0, 0.0);
-    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 0, _r, _g, _b);
-    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 3, _r, _g, _b);
-    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 3, _r, _g, _b);
-    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 3, _r, _g, _b);
-    _ruler.add(trace_to_render_x(Info::Render::_x_max_visible), 0, _r, _g, _b);
-    _ruler.add(trace_to_render_x(Info::Render::_x_min_visible), 0, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_min_visible), 0, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_min_visible), 3, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_max_visible), 3, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_max_visible), 3, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_max_visible), 0, _r, _g, _b);
+    _ruler.add(trace_to_render_x(_x_min_visible), 0, _r, _g, _b);
 
     //draw graduations
     set_color(1.0, 1.0, 1.0);
 
-    for (Element_pos i = Info::Render::_x_min_visible ; i < Info::Render::_x_max_visible ; i+=graduation_diff){
+    for (Element_pos i = _x_min_visible ; i < _x_max_visible ; i+=graduation_diff){
         const Element_pos grad_div_by_5 = graduation_diff/5;
         for (Element_pos j = (i+grad_div_by_5) ; j<(i+graduation_diff) ; j+= grad_div_by_5){
             draw_line( trace_to_render_x(j) + offset_x, 3,
diff --git a/src/statistics/Statistics_window.cpp b/src/statistics/Statistics_window.cpp
index 385705dc5c1f271cd03bebca49b4f35b4a6b7895..aa952e1be89235f794029afe0989ca9a0b8617ca 100644
--- a/src/statistics/Statistics_window.cpp
+++ b/src/statistics/Statistics_window.cpp
@@ -192,9 +192,9 @@ void Statistics_window::on_reload_button_clicked() {
         return ;
     }
 
-    auto range = (Info::Render::_x_max_visible - Info::Render::_x_min_visible);
-    auto start_time = Info::Render::_x_min_visible + _start_time_widget->value() * range / 100;
-    auto end_time   = Info::Render::_x_min_visible + _end_time_widget->value() * range / 100;
+    auto range = (_render->_x_max_visible - _render->_x_min_visible);
+    auto start_time = _render->_x_min_visible + _start_time_widget->value() * range / 100;
+    auto end_time   = _render->_x_min_visible + _end_time_widget->value() * range / 100;
 
     auto interval = Interval{start_time, end_time};
 
diff --git a/src/trace/values/Date.cpp b/src/trace/values/Date.cpp
index 9a668ede7f5c706204768d727a80d0a9c5a02645..1a3e014fb47b5cc2ef81e8a402197aeffc84b93a 100644
--- a/src/trace/values/Date.cpp
+++ b/src/trace/values/Date.cpp
@@ -70,10 +70,11 @@ Date::Date(double value) : _value(value) {
 Date::Date(const std::string &value) {
     _is_correct = convert_to_double(value, &_value);
 
-    if (_value > Info::Entity::x_max)
+    if (_value > Info::Entity::x_max) {
         Info::Entity::x_max = _value;
-    else if ((Info::Entity::x_min > _value) && (_value != -1.))
+    } else if ((Info::Entity::x_min > _value) && (_value != -1.)) {
         Info::Entity::x_min = _value;
+    }
 }
 
 std::string Date::to_string() const{